【问题标题】:Are lib files exclusively statically linked or do they need to be compiled specifically (VS2015)lib文件是专门静态链接的还是需要专门编译的(VS2015)
【发布时间】:2017-01-04 19:16:17
【问题描述】:

我对静态和动态链接库以及 .lib 和 .dll 文件有些困惑。

我有一个包含两个库的项目,一个是我自己构建的,一个来自开源库。

我自己构建的项目是同一解决方案(Visual Studio 2015,C++)中的一个单独项目,我不需要复制 .lib 文件或为可执行文件创建 DLL 来构建和运行

对于其他开源库,我确实需要将 .lib 文件和 DLL 复制到可执行文件夹中。但是,我认为可以静态链接 .lib 文件而不必复制 DLL。

这是否意味着我需要以不同的方式编译开源库?就像将定义 __declspec(dllexport) 更改为 __declspec(dllimport) 一样?或者在编译器选项中将/mD改为/mT?

这两个我都试过了,还是说没有.dll就无法启动

或者我可以通过更改可执行项目中的设置来静态链接这个库吗?如果有,这些设置是什么?

编辑:我知道这是一个可以在谷歌上查找的标准问题,但我有一段时间无法找到确切的答案。主要是,我对需要更改什么设置以及需要更改它们的哪个项目感到困惑。(库或可执行文件)。

我假设静态链接意味着库内置于可执行文件中,而动态链接意味着库需要位于单独的文件中,如果不正确,请告诉我。否则,我需要知道如何将库 构建到 可执行文件中。

我可以继续更改开源库中的构建选项,我已经尝试过了。

谢谢, -D

【问题讨论】:

    标签: c++ winapi visual-studio-2015


    【解决方案1】:

    在 Windows 中,dll 文件(动态链接库)需要与应用程序位于同一目录中或位于搜索路径中。 lib 文件(静态库)需要在链接期间(构建应用程序的最后一步)进行静态链接。它在 Windows 中很常见,因此有一个库带有 dll 和 lib 文件。在这种情况下,lib 文件是一个导入库,其中包含轻松链接到 dll 所需的信息。

    将 dll 文件放置在您的应用程序将被构建并与 lib 文件静态链接的位置。转到“Project->Properties->Link->Input->Additional Dependencies”和“Project->Properties->Link->General->Additional Library Directories”指定要链接的静态库。

    编辑:看来我误解了这个问题。问题是如何将动态库重新编译为静态库。您需要正在使用的库的源代码以及它的 Visual Studio 项目文件。打开库并在 `Project->Properties->General->Configuration Type' 中将其从动态库更改为静态库。

    请注意,动态库使用 Linker 属性组,而静态库使用 Librarian 属性组。在这些类型之间进行更改可能会导致项目删除必要的链接器标志选项。由于每个图书馆都不同,我无法预测您将要解决这个问题。确保备份项目文件,以便您可以看到原始选项和标志。

    【讨论】:

    • 但这需要我将 dll 放入我试图避免的可执行目录中。有没有办法将库构建到可执行文件中?
    • @MiPo 对不起,我误解了这个问题。我将编辑我的答案。
    • 感谢您的回答,不过我已经尝试过了,它仍然需要一个 dll。当我构建库时,它还一起构建了一个 lib 和一个 dll 文件。我错过了某个地方的设置吗?代码生成中的运行时库设置是否与此有关?我也尝试过更改但没有成功
    • 如果项目设置为静态库,则不会生成 dll 文件。确保在构建静态库之前进行清理(也许旧的 dll 文件从未被删除)。您的解决方案中是否还有其他项目可以构建 dll?您链接的库是否依赖于 dll 文件,而不是构建它?检查 'Project->Properties->Build Events' 中的构建事件是否有其他可能构建 dll 的事件。
    • 不,我什么也没看到,库中没有对任何其他库的引用,我唯一能想到的就是预处理器定义:WIN32;_DEBUG;_WINDOWS;_USRDLL ;DXL_X86_CPP_EXPORTS;但我尝试删除它们,它仍然构建一个 dll
    【解决方案2】:

    我不得不更改所有配置的“静态库”设置,而不仅仅是调试,尽管它是在调试中构建的。不确定是什么原因造成的。可能是因为库的调试版本和发布版本设置为同一个文件夹,所以在构建时它可能已经用发布版本覆盖了调试版本

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多