在构建dll时,可以使用库进行链接吗?

When building a dll, can the lib be used for linking?

本文关键字:链接 dll 构建 可以使      更新时间:2023-10-16

我想创建一个c++ dll(用于点网络应用程序)。我需要的一些功能已经在另一个c++ dll中实现了。

我引用的dll是这样设置的(包括注释):

extern "C"
{
  __declspec(dllexport) BOOL SomeFunctionToBeUsedExternally();
}
// internal functions
BOOL OtherFunctions();

我需要在我的代码中使用一个OtherFunctions

所以,我在自己的代码中添加了适当的include,添加了对上面dll创建的库的依赖,并使用了我需要的方法。结果,当然,我得到了另一个__declspec(dllexport)...函数。

它拒绝链接虽然,我得到了一个关于OtherFunction的错误。

我核实了一切,上网看了看——似乎没有什么能解决我的问题。

然后,我在我需要的函数前面添加了一个__declspec(dllexport),它就工作了。

我不明白。我想,dllexport标记的函数将被导出到dll,但不是所有的函数都发送到lib吗?

为什么我必须导出函数到dll,如果我不链接dll,但对库?

不,链接器不会自动导出所有标识符。dllexport属性告诉链接器导出哪些标识符。否则,您将被迫导出DLL中的每个标识符,或者指定不应该导出哪些标识符。当链接器创建DLL时,它还创建了一个导入库,并包含关于基于该属性导出哪些标识符的信息。

当你想使用DLL时,你需要链接到适当的.lib文件。.lib文件告诉链接器哪些标识符被导出,它们所在的DLL的名称和其他信息。也可以通过序号从DLL导出标识符,而不是通过名称。在这种情况下,链接器仍然需要用适当的序号匹配标识符。这只能通过附带包含该信息的库文件来实现,因为它不存在于DLL的导出表中。

不,只有导出的函数在.lib中结束。你也看得出来。

不是一个静态链接库,它是DLL的导入库。这是一个非常简单和非常小的文件,因为它根本不包含任何代码。只是一个导出函数的列表。链接器需要它在客户端代码中解析外部,它需要知道DLL的名称和实际导出的函数名称或序数(可能不同),以便它可以将条目添加到客户端的导入表中。导入库与静态库具有相同的文件扩展名可能有点不幸。