我对库链接和.lib文件有疑问......
这是背景:
我创建了一个DLL:MyLib.dll 要在我的QT项目中使用该库,我只需要包含一个包含路径,一个指向库的链接并使用头文件:
LIBS += "C:\myPath\MyLib.dll"
INCLUDEPATH += "C:\myPath"
HEADERS += \
../myPath/MyLib_global.h \
../myPath/mylib.h
我在我的项目中使用第三方dll:third.dll
如果我执行与上例相同的操作,则不起作用:
LIBS += "C:\myPath\third.dll"
第三方DLL附带.lib文件“third.lib”,我显然需要与DLL一起使用。
为什么?为什么有些DLL库需要.lib文件,但其他DLL库却不需要?
是不是.lib是一个访问DLL的静态库?
非常感谢!
答案 0 :(得分:7)
我的回答可能不是特定于上下文,但对于大多数提出相同问题的开发人员都很有用。这是由安东尼威廉姆斯回答的。
您不需要.lib文件来使用动态库,但没有动态库 您不能将DLL中的函数视为您的常规函数 码。相反,您必须手动调用LoadLibrary来加载DLL(和 FreeLibrary(完成后)和GetProcAddress获取 DLL中的函数或数据项的地址。你必须投 返回的地址为适当的指向函数的指针 用它。
答案 1 :(得分:6)
lib文件是一个导入库文件,它允许最终的可执行文件包含一个导入地址表(IAT),通过该表引用所有DLL函数调用。基本上,允许查找函数。
您可以阅读here。
要让Qt生成lib,请将其添加到.pro: -
CONFIG+= staticlib
Here's一些关于如何创建库的文档。
答案 2 :(得分:0)
这是为什么?为什么有些 DLL 库需要 .lib 文件而其他 DLL 库不需要?
链接dll有两种类型: 加载时动态链接 [隐式] 运行时动态链接 [显式]
如果您使用 dll 的运行时动态链接,则不使用 .lib 但是,对于 dll 的加载时动态链接,使用了 .lib 文件