【问题标题】:How do I resolve LNK1104 error with Boost Filesystem Library in MSCV?如何使用 Boost Filesystem Library 在 MSCV 中解决 LNK1104 错误?
【发布时间】:2010-10-03 00:28:12
【问题描述】:

我无法让我的项目链接到 Microsoft Visual C++ 2008 Express Edition 中的 Boost(版本 1.37.0)文件系统 lib 文件。文件系统库不是一个仅头文件的库。我一直在关注官方 boost 网页上发布的 Getting Started on Windows 指南。以下是我采取的步骤:

  1. 我使用 bjam 构建了完整的 lib 文件集:

    bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete
    
  2. 我将 /libs 目录(位于 C:\Program Files\boost\build-boost\boost\bin.v2)复制到 C:\Program Files\boost\boost_1_37_0\libs.

  3. 在 Visual C++ 中,在 Project > Properties > Additional Library Directories 下我添加了这些路径:

    • C:\Program Files\boost\boost_1_37_0\libs
    • C:\Program Files\boost\boost_1_37_0\libs\filesystem\build\msvc-9.0express\debug\link-static\threading-multi

    我绝望地添加了第二个。它是 libboost_system-vc90-mt-gd-1_37.lib 所在的确切目录。

  4. Configuration Properties > C/C++ > General > Additional Include Directories 我添加了以下路径:

    • C:\Program Files\boost\boost_1_37_0
  5. 然后,为了锦上添花,在 Tools > Options VC++ Directories > Library files 下,我添加了步骤 3 中提到的相同目录。

尽管如此,当我构建我的项目时,我收到以下错误:

fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_37.lib'

此外,这里是我试图编译的代码以及上述(假定正确的)lib 文件所在目录的屏幕截图:

#include "boost/filesystem.hpp"   // includes all needed Boost.Filesystem declarations
#include <iostream>               // for std::cout
using boost::filesystem;          // for ease of tutorial presentation;
                                  //  a namespace alias is preferred practice in real code

using namespace std;

int main()
{
    cout << "Hello, world!" << endl;

    return 0;
}

【问题讨论】:

    标签: c++ visual-c++ boost filesystems linker


    【解决方案1】:

    Ferruccio 的回答包含了大部分见解。然而,Pukku 让我意识到我的错误。我发布自己的答案以给出完整的解释。正如 Ferruccio 解释的那样,Filesystem 依赖于两个库。对我来说,这些是:

    • libboost_system-vc90-mt-gd-1_37.lib
    • libboost_filesystem-vc90-mt-gd-1_37.lib

    我一定没有注意到,当我提供 libboost_filesystem-vc90-mt-gd-1_37.lib 的目录时,错误输出从

    fatal error LNK1104: cannot open file 'libboost_filesystem-vc90-mt-gd-1_37.lib'
    

    fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-gd-1_37.lib'
    

    让我认为错误仍然存​​在。这导致我发布一些相当不准确的信息。另外,在阅读了 Filesystem 需要两个库之后,我现在看到了 bjam 命令的关键字 stage 的重要性。供应

    bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage
    

    使 bjam 在 boost_1_37_0 目录中放置一个附加目录,恰当地命名为 stage。此文件夹包含一个名为 /lib 的文件夹,该文件夹在一个位置包含所有 lib 文件的副本。这对 Visual C++ 来说很方便,因为您可以为它提供这个单一目录,它会处理所有依赖项。

    【讨论】:

    • 我明白了。我总是用 install 关键字而不是 stage 来构建,结果是不同的。
    • 好的,我需要一些帮助 - 我有同样的问题(我使用的命令与您指定的相同) - 但我得到的文件是:boost_system-vc90-mt-gd -1_44.lib 而不是“libboost_system-vc90-mt-gd-1_44.lib”。 (我正在使用更高版本的 boost,但我的文件名前面没有所需的“lib”)。我的编译器一直在询问“libboost_system-vc90-mt-gd-1_44.lib”。
    • @sparkFinder bjam 的命令行选项 stage 使 bjam 将所有内置库放入 boost_M_mm_b\stage\libboost_system-vc90-mt-gd-M_mm.liblibboost_system-vc90-mt-gd-M_mm.lib 都应该在那里(M、mm 和 b 只是 Boost 的主要、次要和构建版本的通用符号)
    【解决方案2】:

    boost::filesystem 依赖于 boost::system,所以你需要两个路径。

    部分问题是您使用的是构建目录之外的 boost 库,而不是安装目录(boost 构建过程应该同时创建两者)。 install/lib 目录有所有的库,所以你只需要指定一个路径。

    boost 构建过程在其自己的目录中构建每个库。最后,它将所有这些 .lib 文件复制到一个公共的 lib 目录中。

    由于您没有将安装目录指定为构建命令的一部分(使用 --prefix=...),我相信默认值为 C:\Boost。检查该目录是否存在,如果存在,请使用 C:\boost\include\ boost-1_37 作为包含路径,使用 C:\boost\lib 作为库路径。

    【讨论】:

    • 你说的是bjam命令吗?我确实提供了一个目录。我没有名为“C:\boost”的目录。我将指定“build-boost”目录下生成的/libs目录复制到boost_1_37_0下已有的/libs目录下。
    • 你说得对,它需要系统库。我在 Pukku 的回答中对此发表了评论。我将系统误读为文件系统。那么,两者都需要吗?也许这就是我感到困惑的原因。但是,当我用系统库替换文件系统库时,我认为我删除了文件系统库的路径。我会...
    【解决方案3】:

    最后一个答案是正确的。 但是你应该找到 boost 配置文件 $BOOST\config\user.hpp 和 取消注释此指令#define BOOST_ALL_DYN_LINK。 现在它开始使用带有 boost 的动态链接,它应该可以工作了。

    【讨论】:

    • 欢迎来到堆栈溢出。请注意,在投票时会采用答案,因此当您写“最后一个答案”时,您并不清楚您的意思是哪个答案。
    【解决方案4】:

    我认为真正的原始问题与 Windows 上默认的 boost 构建过程有关,该过程需要静态链接一个名为 beginning libboost_sytem&lt;etc..&gt; 的库。你需要的宏是

    #define BOOST_SYSTEM_DYN_LINK
    

    这确保了 Boost.System 库是动态链接的。动态库名称为 boost_system&lt;etc...&gt;,与静态库 libboost_sytem&lt;etc...&gt; 相同

    【讨论】:

      【解决方案5】:

      bjam 命令行应该已经构建了所有库的所有版本。不过,当您使用

      构建时
      bjam --build-dir="C:\Program Files\boost\build-boost" --toolset=msvc --build-type=complete stage
      

      (注意末尾的stage)所有库都被复制到一个公共的 libs/ 文件夹中,因此当您只将此 libs/ 文件夹添加到您的库路径时,MSVC 的自动链接功能就会起作用。

      我不知道没有stage 的bjam 是否仍将所有这些文件复制到一个文件夹中。如果没有,请执行这样的stage 构建来执行此操作。如果它们是,那么,抱歉,配置似乎正确,也许是某个地方的小输入错误?

      【讨论】:

      • 我知道附加的 stage 关键字。我选择不考虑这个问题,因为当我使用它时,它只是在 C:\Program Files\boost\boost_1_37_0 中创建了一个名为 stage 的目录。该目录包含一个名为 lib 的文件夹,其中包含一堆...
      • ...相同的库文件。也许我应该告诉 Visual C++ 在这个目录中查找?据我所知,这些是位于 C:\Program Files\boost\build-boost\boost\bin.v2\libs 中的相同 lib 文件。
      • 啊!现在我明白你的意思了。我不知道 Filesystem 依赖于多个库,现在看到了 stage/lib 目录的便利。实际上,为方便起见,这些是位于一个位置的所有 lib 文件的副本。谢谢你。很抱歉我一开始就误解了你。
      【解决方案6】:

      您发布的错误抱怨文件 libboost_system-vc90-mt-gd-1_37.lib,但在目录中您只有 libboost_filesystem-vc90-mt-gd-1_37.lib对吧?

      查找 libboost_system-vc90-mt-gd-1_37.lib。如果找到了,将对应的目录添加到库搜索路径中。如果找不到,请查看是否有 boost_system-vc90-mt-gd-1_37.lib(就像我一样),然后尝试将其复制到所需的文件名。

      【讨论】:

      • 是的,我有 libboost_system-vc90-mt-gd-1_37.lib。正如我所说,它位于 C:\Program Files\boost\boost_1_37_0\libs\filesystem\build\msvc-9.0express\debug\link-static\threading-multi
      • 好吧,您并没有真正说您确实有一个具有此特定名称的文件。不过好吧,那是另外一回事了……
      • 我很抱歉不够清晰。这就是我说“这是 lib 文件所在的确切目录”时的意思,但我想直到在帖子后面我才命名链接器正在寻找的文件。
      • 我相信 link-static 在文件名中应该以 sgd 结尾,但你只有 gd。但是,我不知道这有什么帮助:(
      • 我添加了目录的屏幕截图。
      【解决方案7】:

      我也遇到了同样的问题,你需要做的是将顶层boost文件夹下的“lib”目录添加到Visual C++中的库路径中。

      这绝对为我解决了这个问题。

      【讨论】:

      • 是的。这也为我修复了它。我不得不将“libboost_unit_test_framework-vc90-mt-1_43.lib”和“libboost_unit_test_framework-vc90-mt-gd-1_43.lib”复制到QuantLib目录中的“lib”子目录中(这是它唯一需要的)。我还必须将头文件复制到目录“boost”中,以阻止它抱怨缺少头文件。出于某种原因,我还不得不将构建更改为“调试”(从“调试(静态)”),因为我没有默认构建的 -sgd- 库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多