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

103
我好像无法使这个功能生效。我制作了一个简单的控制台应用程序(依赖于 websocket++ 库),需要使用 Boost 库。但是,当我尝试编译时,会出现以下错误信息:

fatal error LNK1104: cannot open file 'libboost_system-vc110-mt-gd-1_51.lib'

然而,我已经使用 bjam 创建了库,并将路径链接到编译器的 C++/Additionnals includes 中。

如果我在 (boost_root)/stage/libs 目录中查看,文件 libboost_system-vc110-mt-gd-1_51.lib 并不在那里。相反,它被称为 libboost_system-vc110-mt-sgd-1_51.lib

有什么想法吗?

1
我已经能够使用bjam进行完整构建,生成了libboost_system-vc110-mt-gd-1_51.lib文件,但我仍然遇到错误。 - Rushino
26
打开“VS2012开发人员命令提示符”,进入你的boost根目录,输入“bootstrap”命令,然后输入“b2”命令,就可以得到一个完整的库文件集合。 - Jesse Good
你是否将包含路径和链接器路径添加到你的项目中了? - Jesse Good
1
你是否正在使用/MD构建你的应用程序? - Mahesh
如果可以下载而不是编译,可以从这里获取库文件: http://code.ingres.com/boostlib/trunk/stage/lib/ - gorogm
12个回答

119

这是我这样的业余爱好者自学C++最简单的方法:

首先解压缩boost库到任意目录。我建议在c:\directory目录下。

  1. 打开你的Visual 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 (不必在命令窗口上输入任何内容,只需等待并且不要关闭窗口即可。这就是我遇到的问题,花了我两周时间才解决。过了一会儿,booststrap 将运行并生成相同的文件,但现在有两个不同的名称:b2bjam
  3. 单击 b2 并等待其运行。
  4. 单击 bjam 并等待其运行。然后将生成一个名为 stage 的文件夹。
  5. 右键单击项目。
  6. 点击属性。
  7. 点击链接器。
  8. 点击一般。
  9. 选择包含附加库目录。
  10. 选择库的一部分,例如:c:\boost_1_57_0\stage\lib

然后你就可以开始了!


4
非常感谢你吴杰——我以前从未做过这样的事情,这些步骤正是我需要构建Boost和生成缺失的'libboost_serialization-vc140-mt-gd-1_57.lib'库文件所需的,我之前遇到了链接问题 :) - Vixxd
7
谢谢,我喜欢详细的说明。对于设置boost的第2/3/4步,我做了以下操作:a)以root身份打开命令行提示符;b)切换到boost_1_57_0目录;c)输入“bootstrap.bat”(需要10-20秒);d)按照说明输入“./b2”(然后需要30-40分钟才能完成)。 - Darren Cook
3
由于常规命令提示符不知道如何处理“cl”命令,我不得不使用Visual Studio命令提示符打开bootstrap.bat。 - jlaverde
2018年2月20日,你的解决方案对我起作用了(VS2017 + Boost 1.66)。非常感谢你。 - CaTx
谢谢你提供给初学者的步骤。我希望每个人都能像你一样给出这样的答案。 - Mudit Jain
我会添加一个额外的步骤:在导入“Boost.Python”之前添加#define BOOST_PYTHON_STATIC_LIB。似乎Boost默认使用动态库。强制它使用共享库解决了我的(完全相同的)问题。 - Buzz

99

C++ → General → Additional Include Directories参数用于列出编译器搜索头文件的目录。

您需要告诉链接器查找要链接的库的位置。要访问此设置,请在Solution Explorer窗口中右键单击项目名称,然后选择Properties → Linker → General → Additional Library Directories。在此处输入<boost_path>\stage\lib(如果您使用默认选项构建Boost,则这是库所在的路径)。


1
@ ggsmartboy 这是boost源文件所在的路径(与编译器包含路径中列出的路径相同,以便找到boost头文件)。该答案假定您使用默认构建选项自己构建了boost(而不是使用分发)。 - Praetorian
太棒了。这也避免了我真正的头痛。为什么我似乎无法在boost文档中找到它(即使有),我不知道! :) - absentmindeduk
2
此答案中提到的设置可以在右键单击“项目”并选择属性(对于像我这样的新手,右键单击解决方案,转到工具>选项等。但并非所有项目都有这些选项)中找到。VS2013 - Mr_and_Mrs_D
1
@Mr_and_Mrs_D 您说得对,我确实假设读者知道那部分内容。已更新。 - Praetorian
1
我在 Boost 1.64 中没有“stage”文件夹。 - Archont
显示剩余3条评论

8

另一种解决方案:

我之前在链接-〉附加依赖项属性中包含了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个赞,但我每隔几个月就会来到这里,再次被提醒我的问题的解决方案!! - Neil Gatenby

6
我也遇到了同样的问题。原因是我使用Visual C++ 2010(v100)编译Boost库,然后错误地尝试在Visual Studio 2012 (v110)中使用该库。
所以,我改变了配置(在Visual Studio 2012中),进入“项目属性” -> “常规” -> “平台工具集”,将值从“Visual Studio 2012 (v110)”改为“Visual Studio 2010 (v100)”。

7
我希望你明白,当你将平台工具集更改为使用v100时,你告诉VS2012 IDE使用与VS2010一起发布的编译器。任何添加到VS2012编译器的C++11特性都将不可用。更好的解决方案是使用VS2012编译器编译Boost,你可以拥有从2010和2012生成的库文件并存,因为Boost将编译器版本号放入输出文件名中。 - Praetorian
你说得对,我也知道。我担心如果升级库和编译器会发生什么事情。所以,当项目完成后我会解决所有这些问题。谢谢! - Jota Santos

3

我曾经也遇到过同样的问题,我的错误在于我安装了二进制文件boost_1_55_0-msvc-11.0-32.exe用于visual c++ 2010,但它的版本是v100(项目属性->配置属性->常规->平台工具集),而不是visual c++ 2012的v110。所以我下载了boost_1_55_0-msvc-10.0-32.exe,现在一切都正常了。


3

在使用Visual Studio 2015(社区版)时,我尝试使用boost单元测试时遇到了类似的问题:

致命错误 LNK1104:未找到文件 libboost_unit_test_framework-vc140-mt-1_57

我想分享我的解决方案。

你可以通过以下两种方式之一创建boost单元测试项目(这个解决方案适用于这两种方式):

  1. 使用Boost Unit Test适配器
  2. 或创建Win32控制台应用程序, (步骤在这里), 然后将主函数替换为boost单元测试函数(步骤在这里)。

这是我跟随的步骤,以使这两个项目都能正常工作:

首先,下载所需的boost版本(例如,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 address-model=32

其中msvc-14.0指定了我们需要的Visual Studio 2015版本 (VS 2015 = v14.0 = v140),而address-model=32指定我们需要平台32位(但64位也可以这样做)。

一旦你拥有了二进制文件,进入Visual Studio,选择您创建的Boost Unit测试项目。 转到项目属性>配置 (从主菜单),并进行以下选择:

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

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

    • C / C ++>其他包含目录
    • 以及“链接器>其他库目录”。

2

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

"Original Answer"翻译成"最初的回答"

更详细地解释这些代码行在做什么以及为什么要这样做,可以提高这个答案的质量。 - Anton Menshov

2
如果您在构建Boost时遇到问题或者不愿意这样做,另一个选择是从SourceForge下载lib文件。该链接将带您进入版本1.51的已压缩的lib和dll文件的文件夹。但是,您应该能够编辑链接以指定所选版本。显然,BoostPro提供的安装程序存在一些问题。

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

0

2>LINK: 致命错误 LNK1104: 无法打开文件'libboost_regex-vc120-mt-sgd-1_55.lib'

在我的情况下,旧继承项目中没有可用的bootstrap/bjam(库已经被编译并提交到源代码管理器),这些库的文件名中没有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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接