程序静态链接到库,但仍需要 dll 才能运行
Program statically linked to a library but still needs dll to run
有些事情我不明白......我正在使用第三方库(GEOS 库)编写程序。该程序依赖于geos.lib,但仍需要geos.dll才能运行。
我读了这个问题,我想我明白静态库和动态库之间的区别。我不明白的是,为什么当我静态链接库时,我仍然需要一个dll。
Windows 上有 3 种库:
- 对象库 (*.lib)
- 导入库 (*.lib)
- 动态库 (*.dll)
对象库是静态链接的。它们包含库抽象的代码的完整对象定义。
导入库是对象库的一种特殊形式。它们不包含代码,而是包含链接器的信息,链接器最终将可执行文件映射到动态链接库。
动态链接库(如对象库)为程序提供代码。但是,此代码在运行时加载,不会编译到您的 exe 中。
您并不总是需要链接导入库。相反,您可以调用 LoadLibrary() 并按名称或序号查找 API 入口点。(您始终必须告诉代码要输入哪个 DLL 以及您要在该 DLL 的 API 中的位置。
此处的其他注释是正确的,因为如果不重新编译库的代码,就无法将 DLL 转换为静态库 - 这是一种不同类型的输出。
它不是静态链接的。 .lib只是一个存根库,它绑定在窗口的.dll中。 也就是说,您在编译时与 .lib 链接,然后在运行时它将查找.dll。
如果 .lib 是由 Visual Studio 创建的,请检查项目属性 -> 链接器 -> 输入 -> 模块定义文件的值。如果它不为空,则链接.exe创建存根库而不是静态库,即使项目属性 -> 常规 -> 配置类型为"静态库 (.lib)"。
您肯定链接到一个动态库。仅仅因为链接器需要 .lib 文件并不意味着您要链接到静态库。
且仅当这是静态库文件时,您才能静态链接 lib 文件。因此,首先您需要将dll的项目转换为静态库,构建它,然后使用构建的产品,它将是一个静态.lib文件。
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 如何使特定程序仅从安装的路径运行以避免DLL劫持
- c++ 注入器运行,但不注入 DLL
- 在运行时加载C++ DLL
- 尝试运行 gmp 时未找到 MPIR.dll
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- 如何将我的程序转换为.dll文件并使用rundll32.exe在cmd中运行它?
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- C\C++构建的dll在LabView中实时运行
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 在注入的 Dll 的 DllMain 中运行代码导致注入超时
- CLR dll 无法运行托管 DLL,除非它位于 exe 目录(或其子目录)内
- MSVCP140.dll尽管设置了 /MT 运行时库
- 通过托管C++包装程序从非托管C++dll运行C#函数
- 使用 libstdc++6.dll 运行代码时出错
- 使用 DLL 运行时,按钮上不显示位图
- 无法对libhydro.dll运行java本机访问
- 当从DLL运行时,c++ cdialgex丢失ParentWnd
- MSVCR100D.dll运行时错误