【问题标题】:Adding Boost Library to a C++ project in OS X Eclipse在 OS X Eclipse 中将 Boost 库添加到 C++ 项目
【发布时间】:2011-05-25 00:27:30
【问题描述】:

我一直在尝试使用 Eclipse 使用 boost 文件系统库来设置 C++ 项目。我按照these 的指示在我的系统上安装了 boost。方向很远

  1. 下载
  2. 提取
  3. 运行 bootstrap.sh
  4. 运行 ./bjam architecture=combined

这似乎很顺利,没有错误。然后我启动了 eclipse 并创建了一个名为 test 的新测试项目,其中包含一个名为 test.cpp 的文件。里面的代码是:

#include <stdio.h>
#include <boost/filesystem.hpp>

int main() {
    boost::filesystem::path path("/Users/schoen"); // random pathname
    bool result = boost::filesystem::is_directory(path);
    printf("Path is a directory : %d\n", result);
    return 0;
}

这只是确保一切设置正确的简单方法。当然,此时我尝试编译但失败了。做了一些谷歌搜索,发现this 站点。它说通过转到项目属性并添加“boost_filesystem”来将boost库添加到链接器。这个我试过了,还是不行。

谁能指出我正确的方向或提示我如何在 Eclipse 项目中设置 Boost?

我是 C++ 和 Eclipse 的新手,我的大部分经验是在 Java 中使用 Netbeans。所以我现在很迷茫。

更新

我只是想根据给出的答案更新我尝试过的内容。

根据 Alex 的建议,我将 boost_system 和 boost_filesystem 添加到链接器列表中。我仍然遇到相同的编译器错误。

根据 rve 的建议,我将 boost 库的路径添加到库搜索路径中。当这不起作用时。我清除了链接器列表并仅使用库搜索路径进行了尝试。这也不起作用。

然后我清除了库搜索路径。然后我手动将链接器窗口上的命令编辑为“g++ -L/Users/jacobschoen/Library/boost_1_45_0/stage/lib -lboost -lboost_filesystem”。这也没有奏效。

在所有这些中,我尝试将 boost 的路径设置为“/Users/jacobschoen/Library/boost_1_45_0”和“/Users/jacobschoen/Library/boost_1_45_0/stage/lib”。都没有用。

根据要求,上述代码的编译器错误是:

**** Build of configuration Debug for project test ****

make all 
Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o"src/test.o" "../src/test.cpp"
../src/test.cpp:10:32: warning: boost/filesystem.hpp: No such file or directory
../src/test.cpp: In function 'int main()':
../src/test.cpp:13: error: 'boost' has not been declared
../src/test.cpp:13: error: expected `;' before 'path'
../src/test.cpp:14: error: 'boost' has not been declared
../src/test.cpp:14: error: 'path' was not declared in this scope
make: *** [src/test.o] Error 1

如果有人有任何进一步的建议,我仍在尝试。

第二次更新 根据 rholmes 的建议,我添加了一个包含库以及链接器列表和库搜索路径。所以现在编译错误是:

**** Build of configuration Debug for project test ****

make all 
Building target: test
Invoking: MacOS X C++ Linker
g++ -L/Users/jacobschoen/Library/boost_1_45_0 -o "test"  ./src/test.o   -lboost_system -lboost_filesystem
ld: library not found for -lboost_system
collect2: ld returned 1 exit status
make: *** [test] Error 1

有什么想法吗?

【问题讨论】:

    标签: c++ eclipse macos boost


    【解决方案1】:

    只是想弄清楚实际有效的方法,因为它是从几个答案拼凑而成的。

    1. 下载 boost 文件并将它们解压到您要放置的位置。
    2. 在终端导航到目录并运行./bootstrap.sh
    3. 完成后运行 ./bjam(这需要一段时间,所以去抽烟喝杯咖啡吧)
    4. 打开您的 Eclipse 项目并转到项目 > 属性 > C/C++ 构建 > 设置
    5. 单击 MacOS X C++ 链接器 > 库。 您应该会看到一个拆分窗口,顶部是“库 (-l)”。在本节中添加boost_systemboost_filesystem。在底部,它应该是“图书馆搜索路径(-L)”。在这里,您希望将 stage/lib 目录的路径放在您提取 boost 下载的位置。它应该类似于下图:
    6. 单击 GCC C++ 编译器 > 包含。这将是一个单独的窗格,上面写着“包含路径(-I)”,我认为这是一个 I,因为他的字体很奇怪,也可能是小写的 l。无论如何,在该部分中添加路径到您放置 boost 的位置,而不使用 stage/lib 部分。它应该如下所示:

    现在一切都应该可以毫无问题地编译了,如果您需要使用任何其他 boost 库,只需将其添加到 boost_filesystem 和 boost_system 所在的链接器部分即可。享受吧。

    【讨论】:

    • 这正是我需要的,但对于 Linux 操作系统。我导航到设置窗格,但唯一可用的选项卡是二进制解析器和错误解析器。关于如何做到这一点的任何想法?我在 Red Hat Enterprise Linux 上使用 Eclipse 3.7.1
    • @jschoen 很棒的解释!
    • 对于以后为 Mac 构建的 Boost,(> 1.5x)我需要将“-mt”添加到我的链接器库选项中。例如,如果我想将 libboost_regex-mt.a 包含到链接器中,我会指定“boost_regex-mt”。
    • 我跟着这个。但我得到这个错误。 ld:架构x86_64 clang的1个重复符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)make:*** [cpp]错误1
    【解决方案2】:

    现在不确定您在 Eclipse 中的哪个位置执行此操作,但在 Eclipse 的包含路径下应该是主 boost 目录的路径(/Users/jacobschoen/Library/boost_1_45_0?)。我认为编译器行应该包含以下内容:

    调用:GCC C++ 编译器

    g++ -I/Users/jacobschoen/Library/boost_1_45_0 -O0 -g3 -Wall -c -fmessage-length=0 -MMD(等等)

    更新:看看我的系统,你的链接器路径可能更合适:

    -I/Users/jacobschoen/Library/boost_1_45_0/stage/lib

    当然,取决于您安装和构建 boost 的方式——这是我最近一次尝试完整源代码构建。根据您获得提升的方式,这可能会或可能不会有所不同。我最近在我的 Mac 上重做了 64 位的提升,但还没有太多时间尝试......

    【讨论】:

    • @rholmes 感谢您的帮助。我想我现在更接近了。基于更新的任何其他想法?
    • 对于我的系统,库路径在 .../boost_1_45_0/stage/lib
    • @rholmes 谢谢老兄。做到了。顺便说一句,欢迎来到 SO。希望我能在未来帮助你作为回报。
    • @jschoen - 感谢您的欢迎!我在许多搜索中都遇到过 SO - 很高兴我的 cmets 提供了帮助!顺便说一句 - 是否有指向 SO 接受的标记类型的链接?标准维基?谢谢!
    • @rholmes 我认为这有大部分标记 - stackoverflow.com/editing-help 这里还有一个常见问题列表meta.stackexchange.com/questions/tagged/faq。如果您有其他关于 SO 的问题,请查看 Meta meta.stackoverflow.com,您可以在其中询问关于 SO 我们的 SO 引擎的问题。此外,如果您沉迷于 SO 的整个格式,请查看 Stackexchange 以查找他们运行的大量网站 stackexchange.com。享受吧!
    【解决方案3】:

    将 boost_system 和 boost_filesystem 一起添加到链接器列表中。

    【讨论】:

    • 今晚我回家后试试。我曾尝试过 boost_filesystem 和 boost,但没有尝试过 boost_system。所以也许可以做到。
    • 还是不行,我什至尝试在我的系统上添加库搜索路径
    • 最新的错误是找不到 boost_system,你有什么想法吗?
    【解决方案4】:

    我最近卸载了 boost rpm 和 installed Boost like how you did。我在 Eclipse 中运行 Boost 程序没有问题。我没有添加任何额外的参数。刚刚安装了 boost 并运行了 Boost 程序。它工作正常。

    在 vi 编辑器中尝试了您的程序。注释掉 main 中的所有内容

    #include <cstdio>
    #include <boost/filesystem.hpp>
    
    int main() {
        /*boost::filesystem::path path("/Users/schoen"); // random pathname
        bool result = boost::filesystem::is_directory(path);
        printf("Path is a directory : %d\n", result);*/
        return 0;
    }
    

    它仍然给出了这个错误:

    /tmp/cc7TAIYS.o: In function `__static_initialization_and_destruction_0(int, int)':
    test.cpp:(.text+0x29): undefined reference to `boost::system::get_system_category()'
    test.cpp:(.text+0x35): undefined reference to `boost::system::get_generic_category()'
    test.cpp:(.text+0x41): undefined reference to `boost::system::get_generic_category()'
    test.cpp:(.text+0x4d): undefined reference to `boost::system::get_generic_category()'
    test.cpp:(.text+0x59): undefined reference to `boost::system::get_system_category()'
    collect2: ld returned 1 exit status
    

    我很困惑。 Boost 程序可以在我的系统上运行,但是您的程序的头文件本身就有问题。我怀疑这是 Eclipse 的问题。它必须是别的东西。

    【讨论】:

    • 这是 Eclipse 的问题。该错误是关于缺少函数的链接器错误。您必须告诉 Eclipse 链接 boost_filesystem 库。我不知道 Eclipse 但使用 gcc 你只需添加类似-L/path/to/boost/libs -lboost_filesystem
    • 其他使用 boost 的程序可以在不链接库的情况下工作,因为它们是仅标头库。
    • @rve 我会根据 Alex 的建议试一试,看看会发生什么。 @Nav我很高兴知道我不仅感到困惑。我以为我正确地遵循了指示,但就是无法让它发挥作用。
    【解决方案5】:

    我刚刚在使用 eclipse 和 CDT 时遇到了与此非常相似的情况...事实证明,使用 ubuntu 和 apt-get,libboost_system 在 /usr/lib 中安装为 libboost_system.1.40.0

    如果您尝试通过 Helios 中的库选项卡添加它,它会抱怨,因为它正在寻找 *.so 而 *.s0.1.40.0 显然不匹配。然而,在仔细查看了链接器试图做什么之后,我只是将原始字符串“boost_system”输入到包含路径添加器中。这导致链接器执行“-lboost_system”,这是链接器知道如何处理解决版本依赖性的一种格式......如果您改为输入 .so 文件的完整路径,链接器只会抱怨,因为它尝试做一个 " -l/usr/lib/libboost_system.so.1.40.0" 。

    所以听从我的建议,在进行 apt-get 安装后输入简单的“boost_system”。它会让一切变得非常简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2011-10-15
      • 2015-06-29
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多