0

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

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

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

我需要OtherFunctions在我的代码中使用其中之一。

因此,我在自己的代码中添加了正确的包含,添加了对上面 dll 创建的 lib 的依赖项,并使用了我需要的方法。结果,当然,我得到了另一个__declspec(dllexport)...功能。

虽然它拒绝链接,但我收到一个关于OtherFunction.

我验证了一切,在网上查看 - 似乎没有什么能解决我的问题。

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

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

如果我不是针对 dll 而是针对 lib 链接,为什么我必须将函数导出到 dll ?

4

2 回答 2

1

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

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

于 2013-06-14T23:46:41.287 回答
1

不,只有导出的函数才会出现在 .lib 中。如你所知。

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

于 2013-06-14T23:42:53.880 回答