C++ 程序静态链接到库,但仍需要dll才能运行
当涉及到链接时,有些事情我不明白。。。我正在使用第三方库(GEOS库)编写一个程序。此程序依赖于geos.lib,但仍需要geos.dll才能运行C++ 程序静态链接到库,但仍需要dll才能运行,c++,dll,linkage,C++,Dll,Linkage,当涉及到链接时,有些事情我不明白。。。我正在使用第三方库(GEOS库)编写一个程序。此程序依赖于geos.lib,但仍需要geos.dll才能运行 我读过,我想我理解静态库和动态库之间的区别。我不明白的是,为什么静态链接库时仍然需要dll。它不是静态链接的。lib只是一个存根库,它绑定到windows上的.dll中。也就是说,您在编译时链接.lib,然后在运行时它将查找.dll。您确实链接到了动态库。 链接器需要.lib文件并不意味着您正在链接到一个静态库。当且仅当该库是静态库文件时,您可以静态
我读过,我想我理解静态库和动态库之间的区别。我不明白的是,为什么静态链接库时仍然需要dll。它不是静态链接的。lib只是一个存根库,它绑定到windows上的.dll中。也就是说,您在编译时链接.lib,然后在运行时它将查找.dll。您确实链接到了动态库。
链接器需要.lib文件并不意味着您正在链接到一个静态库。当且仅当该库是静态库文件时,您可以静态链接该库文件。因此,首先您需要将dll的项目转换为静态库,构建它,然后使用构建的产品,它将是一个静态的.lib文件。Windows上有3种库:
- 对象库(*.lib)
- 导入库(*.lib)
- 动态库(*.dll)
这里的其他注释是正确的,因为如果不重新编译库的代码,就无法将DLL制作成静态库——这是一种不同的输出。如果.lib是由Visual Studio创建的,请检查项目属性->链接器->输入->模块定义文件的值。如果不是空的,则link.exe将创建存根库而不是静态库,即使项目属性->常规->配置类型为“静态库(.lib)”。是否有任何选项允许静态链接特定.dll文件中的代码?我认为您必须编译库以进行静态链接,我不确定编译后是否可以将dll更改为静态链接库。@那么dll文件总是带有.lib?我如何知道何时.lib不够,我需要提供dll?@undu:在Windows上,是的,您总是需要链接.lib才能动态链接dll。dll供应商将始终在某个地方为您提供此服务。你的意思是如何知道.lib是否是静态库?我认为您可以在visual studio中检查这些属性。@undu如果您链接的库是从dll导出函数的静态链接库,那么,如果该dll在搜索路径中不可用,您的应用程序将无法启动。你可以拥有,也可以拥有。还有一个链接器标志(不记得名称),允许您将加载时动态链接延迟到调用dll中的第一个函数的时刻。这是一篇关于链接的好文章。这周我在研究这个完全相同的问题时发现了它。