【问题标题】:fatal error LNK1104: cannot open file 'libboost_system-vc110-mt-gd-1_51.lib'致命错误 LNK1104:无法打开文件“libboost_system-vc110-mt-gd-1_51.lib”
【发布时间】:2012-10-14 02:24:29
【问题描述】:

看来我不能让它工作。我制作了一个简单的控制台应用程序(依赖于websocket++ 库),它需要Boost 库.. 但是当我尝试编译时,我得到:

致命错误 LNK1104:无法打开文件“libboost_system-vc110-mt-gd-1_51.lib”

但是,我做了 bjam,它在 (boost_root)/stage/libs 中创建了库,并将库的路径链接到编译器 C++/Additionnals includes

如果我查看(boost_root)/stage/libs,文件libboost_system-vc110-mt-gd-1_51.lib 不存在。它被称为libboost_system-vc110-mt-sgd-1_51.lib

有什么想法吗?

【问题讨论】:

  • 我已经能够使用 bjam 构建 libboost_system-vc110-mt-gd-1_51.lib 文件,但是我仍然收到错误。
  • 打开VS2012 developer command prompt,进入你的boost根目录,输入bootstrap,再输入b2,你应该会得到一套完整的库文件。
  • 您是否在项目中添加了包含路径和链接器路径?
  • 您是否使用/MD 构建您的应用程序?
  • 如果可以下载而不是编译,请从这里获取库:code.ingres.com/boostlib/trunk/stage/lib

标签: c++ visual-studio boost


【解决方案1】:

对于像我这样自学 C++ 的业余爱好者来说,这是最简单的方法:

首先将 boost 库解压缩到您选择的任何目录。我推荐c:\directory

  1. 打开您的可视化 C++。
  2. 创建一个新项目。
  3. 右键单击项目。
  4. 点击属性。
  5. 点击 C/C++。
  6. 点击常规。
  7. 选择其他包含库。
  8. 包括库目标。例如c:\boost_1_57_0
  9. 点击预编译头。
  10. 点击创建/使用预编译头文件。
  11. 选择不使用预编译头。

如果您遇到问题,请转到链接库。

  1. 转到提取的文件是c:\boost_1_57_0
  2. 点击booststrap.bat(不要费心在命令窗口上输入,只需等待,不要关闭窗口,这是我遇到问题的地方,我花了两周时间才解决。过了一会儿@987654325 @ 将运行并生成相同的文件,但现在有两个不同的名称:b2bjam
  3. 点击b2 并等待它运行。
  4. 单击bjam 并等待它运行。然后将生成一个名为stage 的文件夹。
  5. 右键单击项目。
  6. 点击属性。
  7. 点击链接器。
  8. 点击常规。
  9. 单击包含其他库目录。
  10. 选择库的一部分,例如c:\boost_1_57_0\stage\lib

你很高兴!

【讨论】:

  • 非常感谢吴杰 - 我以前从未做过这样的事情,这些步骤正是我构建 Boost 并生成缺少的“libboost_serialization-vc140-mt-gd-1_57.lib”所需要的库文件我在链接时遇到问题:)
  • 谢谢,我喜欢详细的说明。对于设置 boost 的第 2/3/4 步,我所做的是:a) 打开命令行提示符作为 root; b) 切换到 boost_1_57_0 目录; c) 输入bootstrap.bat(耗时 10-20 秒); d) 按照说明输入./b2(然后需要 30-40 分钟才能完成)。
  • 我不得不使用 Visual Studio 命令提示符打开 bootstrap.bat,因为常规命令提示符不知道如何处理 'cl ' 命令。
  • 2/20/2018,您的解决方案对我有用(VS2017 + Boost 1.66)。非常感谢。
  • 感谢初学者的步骤。我希望每个人都能像你一样给出答案。
【解决方案2】:

C++ → 常规 → 附加包含目录 参数用于列出编译器将搜索头文件的目录。

您需要告诉链接器在哪里寻找要链接的库。要访问此设置,请在解决方案资源管理器窗口中右键单击项目名称,然后属性 → 链接器 → 常规 → 附加库目录。在此处输入<boost_path>\stage\lib(如果您使用默认选项build Boost,这是库所在的路径)。

【讨论】:

  • 你能解释一下什么是 boost_path
  • @ggsmartboy 这是 boost 源文件所在的路径(您在编译器中列出的相同路径包含路径,因此它可以找到 boost 标头)。答案假设您使用默认构建选项自己构建了 boost(不使用发行版)。
  • 太棒了。也让我很头疼。为什么我似乎无法在 boost 文档中发现这一点(如果它甚至存在的话),我不知道! :)
  • 如果您右键单击 project 并选择属性(对于像我这样的菜鸟,右键单击解决方案,转到工具 > 选项),则会找到此答案中提到的设置等等。不过,这些选项并不存在于我的所有项目中)。 VS2013
  • @Mr_and_Mrs_D 你说得对,我确实假设读者知道那部分。已更新。
【解决方案3】:

另一个解决方案:

我被难住了,因为我在 Link->Additional Dependencies 属性中包含了 boost_regex-vc120-mt-gd-1_58.lib,但链接一直告诉我它无法打开 libboost_regex-vc120-mt-gd-1_58 .lib(注意 lib 前缀)。我没有指定 libboost_regex-vc120-mt-gd-1_58.lib。

我试图使用(并且已经构建)boost 动态库 (.dll),但没有定义 BOOST_ALL_DYN_LINK 宏。显然在编译中有提示要包含一个库,并且没有 BOOST_ALL_DYN_LINK 它会查找静态库(带有 lib 前缀),而不是动态库(没有 lib 前缀)。

【讨论】:

  • 仍然只有 1 个赞,但每隔几个月我就会发现自己在这里,再次被提醒解决我的问题的方法是什么!
【解决方案4】:

我遇到了同样的问题。这是因为我使用 Visual C++ 2010(v100) 编译了 Boost,并且我错误地尝试在 Visual Studio 2012 (v110) 中使用该库。

所以,我将配置(在 Visual Studio 2012 中)更改为 Project properties -> General -> Plataform Toolset 并更改从 Visual Studio 2012 (v110)Visual Studio 2010 (v100) 的值。

【讨论】:

  • 我希望您意识到,当您将平台工具集更改为使用 v100 时,您是在告诉 VS2012 IDE 使用 VS2010 附带的编译器。添加到 VS2012 编译器的任何 C++11 功能都将不可用。更好的解决方案是使用VS2012编译器编译Boost;您可以让 2010 和 2012 生成的库共存,因为 Boost 将编译器版本号放入输出文件名中。
  • 你是对的,我知道。我担心如果我升级库和编译器会发生什么。所以,当项目完成后,我会修复所有这些东西。谢谢!
【解决方案5】:

我遇到了同样的问题,我的错误是我安装了二进制 boost_1_55_0-msvc-11.0-32.exe 以与版本为 v100 的 Visual c++ 2010 一起使用(项目属性->ConfiguratioProperties->General->platformTooset ) 不是 v110 作为 Visual c++ 2012。所以我下载了 boost_1_55_0-msvc-10.0-32.exe,现在一切正常。

【讨论】:

    【解决方案6】:

    我在 Visual Studio 2015(社区版)中尝试使用 boost unit testing 时遇到了类似的问题:

    致命错误 LNK1104:libboost_unit_test_framework-vc140-mt-1_57

    所以我想我会分享我的解决方案。

    您可以通过以下两种方式创建 boost 单元测试项目(此解决方案适用于两种方式):

    1. 使用Boost Unit Test Adapter
    2. 或者通过创建一个 Win32 控制台应用程序 (steps here),并用一个 boost 单元测试函数 (steps here) 替换 main 函数。

    以下是我为使这两个项目正常工作所遵循的步骤:

    首先,下载所需的增强版本(例如,boost_1_57_0)。您可以使用正确的二进制文件(使用 msvc v140 编译)下载 boost,或者通过从命令行运行以下命令自行提取二进制文件:

    1. bootstrap.bat
    2. “C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat”x86
    3. bjam --clean
    4. bjam -j4 --debug-symbols=on --build-type=complete toolset=msvc-14.0 threading=multi runtime-link=shared 地址模型=32

    其中 msvc-14.0 指定我们需要 Visual Studio 2015 版本(VS 2015 = v14.0 = v140),而 address-model=32 指定我们需要需要 32 平台(但同样适用于 64 位)。

    获得二进制文件后,转到 Visual Studio,选择您创建的 Boost Unit Testing 项目。转到 项目属性 > 配置(从主菜单)并做出以下选择:

    • 将“常规 > 平台工具集”设置为 Visual Studio 2015 (v140)。

    • 在以下位置包含 boost 文件夹的路径(例如 C:\boost_1_57_0)和包含二进制文件的子文件夹的路径(例如 C:\boost_1_57_0\stage\lib):

      • "C\C++ > 附加包含目录"
      • 和“链接器 > 其他库目录”。

    【讨论】:

      【解决方案7】:

      如果您在构建 boost 时遇到问题或不想这样做,另一种方法是从 SourceForge 下载 lib 文件。该链接会将您带到 1.51 版的压缩 lib 和 dll 文件的文件夹。但是,您应该能够编辑链接以指定选择的版本。显然 BoostPro 的安装程序存在一些问题。

      【讨论】:

        【解决方案8】:

        b2 -j%cores% toolset=%msvcver% address-model=64 architecture=x86 link=static threading=multi runtime-link=shared --build-type=minimal stage --stagedir=stage/x64

        属性 → 链接器 → 常规 → 附加库目录 $(BOOST)\stage\x64\lib

        【讨论】:

        • 详细说明这些行在做什么以及为什么 -> 将有助于提高此答案的质量。
        【解决方案9】:

        如果您使用的是 Visual Studio,您是否尝试过使用工具/NuGet 包管理器来安装 boost_program_options-vcXXX?这是安装 boost 的一种简单方法。

        【讨论】:

          【解决方案10】:

          我在这里报告了同样的问题。 我解决了将 mainTest.cpp 从子文件夹 src/mainTest/ 移动到主文件夹 src/ 的问题 我想这也是你的问题。

          【讨论】:

            【解决方案11】:

            2>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc120-mt-sgd-1_55.lib

            就我而言,bootstrap/bjam 在旧继承项目上不可用(库已预编译并提交给 SCM)。库的文件名中没有 VC 或 BOOST 版本,例如:libboost_regex-mt-sgd.lib,但 Processed /DEFAULTLIB:libboost_regex-vc120-mt-sgd-1_55.lib 以某种方式自动触发。

            通过手动将非版本化文件名添加到:

            <AdditionalDependencies>$(DK_BOOST)\lib64\libboost_regex-mt-sgd.lib</AdditionalDependencies>
            

            并将...vc120-mt-sgd-1_55.lib 列入黑名单

            <IgnoreSpecificDefaultLibraries>libboost_regex-vc120-mt-sgd-1_55.lib</IgnoreSpecificDefaultLibraries>
            

            【讨论】:

              【解决方案12】:

              我在使用 boost 1.60 的 Visual Studio 2012 上遇到了类似的错误:致命错误 LNK1104:无法打开文件“libboost_filesystem-vc110-mt-gd-1_60.lib”

              我通过下载 boost 二进制文件解决了这个问题:

              【讨论】:

                猜你喜欢
                • 2015-09-17
                • 2011-02-22
                • 2011-06-14
                • 2013-05-15
                • 1970-01-01
                • 2017-10-16
                • 2017-11-04
                • 2011-01-17
                • 2019-01-14
                相关资源
                最近更新 更多