我想创建一个C ++ dll(用于dot net应用程序)。我需要的一些功能已经在另一个C ++ DLL中实现。
我引用的dll是这样设置的(包括评论):
extern "C"
{
__declspec(dllexport) BOOL SomeFunctionToBeUsedExternally();
}
// internal functions
BOOL OtherFunctions();
我需要在代码中使用OtherFunctions
之一。
所以,我在我自己的代码中添加了正确的include,在上面的dll创建的lib上添加了依赖项,并使用了我需要的方法。结果,当然,我得到了另一个__declspec(dllexport)...
函数。
虽然拒绝链接,但我收到了关于OtherFunction
的错误。
我验证了所有内容,在线查看 - 似乎没有解决我的问题。
然后,我在我需要的功能前添加了__declspec(dllexport)
,它可以正常工作。
我不明白。我想,dllexport标记的函数会被导出到dll,但是不是所有的函数都发送到了lib?
为什么我必须将函数导出到dll,如果我没有链接到dll而是链接到lib?
答案 0 :(得分:1)
不,只有导出的函数最终会出现在.lib中。你可以说。
它是不一个静态链接库,它是DLL的导入库。它是一个非常简单和非常小的文件,因为它根本不包含任何代码。只是导出函数的列表。链接器需要它来解析客户端代码中的外部,它需要知道DLL的名称和实际导出的函数名称或序号(可能是不同的),因此它可以将条目添加到客户端的导入表中。导入与静态库具有相同文件扩展名的库可能有点不幸。
答案 1 :(得分:1)
不,链接器不会自动导出所有标识符。 dllexport
属性告诉链接器导出哪些标识符。如果没有这个,您将被迫导出DLL中的每个标识符或指定不应导出哪些标识符。当链接器创建DLL时,它还会创建一个导入库,并包含有关基于该属性导出哪些标识符的信息。
当您想要使用DLL时,您需要链接到相应的.lib文件,这是有充分理由的。 .lib
文件告诉链接器导出哪些标识符,它们所在的DLL的名称以及其他信息。也可以通过序数而不是名称从DLL导出标识符。在这种情况下,链接器仍然需要将标识符与适当的序号匹配。只有拥有包含该信息的附带库文件才能实现这一点,因为它不存在于DLL的导出表中。