Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 程序静态链接到库,但仍需要dll才能运行_C++_Dll_Linkage - Fatal编程技术网

C++ 程序静态链接到库,但仍需要dll才能运行

C++ 程序静态链接到库,但仍需要dll才能运行,c++,dll,linkage,C++,Dll,Linkage,当涉及到链接时,有些事情我不明白。。。我正在使用第三方库(GEOS库)编写一个程序。此程序依赖于geos.lib,但仍需要geos.dll才能运行 我读过,我想我理解静态库和动态库之间的区别。我不明白的是,为什么静态链接库时仍然需要dll。它不是静态链接的。lib只是一个存根库,它绑定到windows上的.dll中。也就是说,您在编译时链接.lib,然后在运行时它将查找.dll。您确实链接到了动态库。 链接器需要.lib文件并不意味着您正在链接到一个静态库。当且仅当该库是静态库文件时,您可以静态

当涉及到链接时,有些事情我不明白。。。我正在使用第三方库(GEOS库)编写一个程序。此程序依赖于geos.lib,但仍需要geos.dll才能运行


我读过,我想我理解静态库和动态库之间的区别。我不明白的是,为什么静态链接库时仍然需要dll。

它不是静态链接的。lib只是一个存根库,它绑定到windows上的.dll中。也就是说,您在编译时链接.lib,然后在运行时它将查找.dll。

您确实链接到了动态库。
链接器需要.lib文件并不意味着您正在链接到一个静态库。

当且仅当该库是静态库文件时,您可以静态链接该库文件。因此,首先您需要将dll的项目转换为静态库,构建它,然后使用构建的产品,它将是一个静态的.lib文件。

Windows上有3种库:

  • 对象库(*.lib)
  • 导入库(*.lib)
  • 动态库(*.dll)
对象库是静态链接的。它们包含由库抽象的代码的完整对象定义

导入库是对象库的一种特殊形式。它们不包含代码,而是包含链接器的信息,链接器最终将可执行文件映射到动态链接库

动态链接库与对象库一样,为您的程序提供代码。但是,此代码在运行时加载,而不是编译到exe中

您并不总是需要链接导入库。相反,您可以调用LoadLibrary()并按名称或顺序查找API入口点。(您必须始终告诉代码要输入哪个DLL以及在该DLL的API中的位置。)


这里的其他注释是正确的,因为如果不重新编译库的代码,就无法将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中的第一个函数的时刻。这是一篇关于链接的好文章。这周我在研究这个完全相同的问题时发现了它。