在构建dll时,可以使用库进行链接吗?
When building a dll, can the lib be used for linking?
我想创建一个c++ dll(用于点网络应用程序)。我需要的一些功能已经在另一个c++ dll中实现了。
我引用的dll是这样设置的(包括注释):
extern "C"
{
__declspec(dllexport) BOOL SomeFunctionToBeUsedExternally();
}
// internal functions
BOOL OtherFunctions();
我需要在我的代码中使用一个OtherFunctions
。
所以,我在自己的代码中添加了适当的include,添加了对上面dll创建的库的依赖,并使用了我需要的方法。结果,当然,我得到了另一个__declspec(dllexport)...
函数。
它拒绝链接虽然,我得到了一个关于OtherFunction
的错误。
我核实了一切,上网看了看——似乎没有什么能解决我的问题。
然后,我在我需要的函数前面添加了一个__declspec(dllexport)
,它就工作了。
为什么我必须导出函数到dll,如果我不链接dll,但对库?
不,链接器不会自动导出所有标识符。dllexport
属性告诉链接器导出哪些标识符。否则,您将被迫导出DLL中的每个标识符,或者指定不应该导出哪些标识符。当链接器创建DLL时,它还创建了一个导入库,并包含关于基于该属性导出哪些标识符的信息。
当你想使用DLL时,你需要链接到适当的.lib文件。.lib
文件告诉链接器哪些标识符被导出,它们所在的DLL的名称和其他信息。也可以通过序号从DLL导出标识符,而不是通过名称。在这种情况下,链接器仍然需要用适当的序号匹配标识符。这只能通过附带包含该信息的库文件来实现,因为它不存在于DLL的导出表中。
不,只有导出的函数在.lib中结束。你也看得出来。
不是一个静态链接库,它是DLL的导入库。这是一个非常简单和非常小的文件,因为它根本不包含任何代码。只是一个导出函数的列表。链接器需要它在客户端代码中解析外部,它需要知道DLL的名称和实际导出的函数名称或序数(可能不同),以便它可以将条目添加到客户端的导入表中。导入库与静态库具有相同的文件扩展名可能有点不幸。
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 优化链接的 DLL
- 如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变
- 不能使用隐式链接.dll中的类
- 显式链接 DLL 和类方法
- 哪种方法更好获取静态链接DLL的模块句柄(HMODULE) - 使用GetModuleHandleEx()或LoadLibrary()?
- 在QtCreator中链接dll的未定义引用错误
- 如何在qt中链接dll
- 在虚幻4插件中链接DLL
- 我们可以动态链接 DLL 的不同方法是什么
- 如果使用LoadLibrary显式链接dll,则列出从PE文件导入的函数
- 静态链接.dll和cmake/qt创建者?
- 当显式动态链接dll时,使用std::unique_lock会破坏XP的兼容性
- 导出:使用c++链接DLL
- 使用xerces链接DLL会给出未定义的符号
- Visual Studio中的链接dll
- 链接DLL时命令行错误
- 如何链接.dll库与c++ VS项目
- 设置显式链接DLL的内部变量
- LNK 2019试图链接DLL和EXE