【问题标题】:Linker error LNK1104 with 'libboost_filesystem-vc100-mt-s-1_49.lib'带有“libboost_filesystem-vc100-mt-s-1_49.lib”的链接器错误 LNK1104
【发布时间】:2012-03-26 13:51:36
【问题描述】:

在以发布模式将我的程序链接到 boost::filesystem 模块的过程中,我收到下一个错误:

错误 LNK1104:无法打开文件 'libboost_filesystem-vc100-mt-s-1_49.lib'

但是,在 boost\stage\lib 目录中,我只有下一个引用文件系统模块的库:

libboost_filesystem-vc100-mt-1_49.lib

libboost_filesystem-vc100-mt-gd-1_49.lib

我的问题是:

为什么 VC++ 要求 'libboost_filesystem-vc100-mt-s-1_49.lib?

我应该更改哪些编译器/链接属性以让编译器请求 libboost_filesystem-vc100-mt-1_49.lib?

更新:我的 VC2010++ 解决方案有 2 个项目,其中包括以前的 boost 库:x 是一个库,y(主程序)调用 x。

  1. 当我使用 Configuration type=Static library 和 RuntimeLibrary=Multi-threaded (/MT) 构建 x 时,没问题。
  2. 当我使用 Configuration type=Application (.exe) 和 RuntimeLibrary=Multi-threaded (/MT) 构建 y 时,它会发出我指出的错误,如果我更改为 Configuration type=Static 库,它构建正常,但我的主程序有 .lib 扩展名,而不是预期的 .exe。

【问题讨论】:

  • WRT 您的更新,当您构建静态库时,不会调用链接器,因此任何链接错误都会消失。当您尝试构建使用静态库的 .exe 或 .dll 时,您将遇到相同的链接错误。

标签: c++ boost


【解决方案1】:

您在 C/C++/Code Generation/Runtime Library 中使用 /MT 或 /MTd 选项,它们需要静态库,使用共享库输出提升默认构建。您可以将Runtime Library 切换为/MD 或/MDd。另一个选择是使用静态库输出重新编译 boost,你会得到 'libboost_filesystem-vc100-mt-s-1_49.lib'..

【讨论】:

  • @peachykeen:它会影响 boost 库,我已经使用过这种静态方式。 Boost 静态库可以像这里讨论的那样构建 stackoverflow.com/questions/494629/…
  • 我使用简化的源代码构建构建了 boost 库,即 bootstrap,然后是 .\bjam,假设它已经足够了。我更新了我的问题,可能是我做错了什么。谢谢!!
  • @user255053:请参阅上面 secmask 评论中的链接。您需要使用 link=static 和 runtime-link=static
  • 我正在尝试将调试库链接到我的项目,但相同的 /MTd 选项并不能解决问题。它在发布版本中修复。知道为什么我仍然在调试构建中收到错误吗?
【解决方案2】:

我在最近的一个项目中遇到了类似的问题(继承自悠久的遗产)。

这是一个“穷人的”解决方案:

使用所有变体重建 boost 库,以确保您拥有满足您需求的正确变体。

运行:

.\b2 --build-type=complete

请注意,使用此选项,提升构建时间显然会更长。

这不是一个优雅的解决方案,但我没有时间弄清楚我的项目需要哪个确切选项,所以我只是将它们全部构建。

【讨论】:

  • 这是否需要您在某个特定目录中,和/或定义某些 PATH 或类似的东西?
  • 我得到:“'.\b2' 未被识别为内部或外部命令、可运行程序或批处理文件。”当我尝试使用 /boost 目录中的 VS 2017 x86 本机工具命令提示符运行“.\b2 --build-type=complete”时。
【解决方案3】:

您可以将以下字符粘贴到您的控制台(win+r----cmd,然后进入boost src目录,找到bjam.exe) ps:双击bootstrap.bat可以得到bjam.exe

bjam --toolset=msvc-1.0 --stagedir=./lib_x64 --builddir=./ address-model=32 link=static variant=release runtime-link=static threading=multi stage debug releasde


libboost_filesystem-vc100-mt-s-1_49.lib


"link=static" correspond to -s-
"threading=multi" correspond to -mt-
"runtime-link=static" correspond to lib prefix
"variant=release" make sure libboost_filesystem-vc100-mt-s-1_49.lib don't contain -gd-

【讨论】:

  • gd 代表什么?
  • 这个答案对我有帮助。
【解决方案4】:

boost\stage\lib directory 中的 boost 库动态链接到标准 C++ 库。请参阅以下帖子:

boost lib build configuraton variations

您的代码静态链接到标准 C++ 库,因此不匹配。尝试将您的代码动态链接到标准库。 (项目设置->常规->配置类型)

【讨论】:

  • 您阅读我发布的链接了吗?你知道 boost lib 文件名中的“-s”代表什么吗?
  • +1;很好的答案,我添加了一些内容,希望能避免进一步的混淆
  • 嗨,我更新了我的问题,试图给你更多的元素来帮助我。感谢您的理解。
【解决方案5】:

在 VS2013 x86 Native Tools 命令提示符中运行以下命令以静态重建 boost。

b2 -link=static

在 VS 的项目链接路径中添加链接器库路径。 然后,重建您的项目,错误消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多