在OS X Eclipse中将Boost库添加到C++项目

9
我一直在尝试使用boost文件系统库在eclipse中设置C++项目。我按照这些说明在我的系统上安装了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 都很陌生,我的大部分经验都是在 Netbeans 中使用 Java。所以我现在很迷茫。
更新:
我想更新一下我根据答案尝试过的内容。
基于 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

任何想法?
5个回答

16

为了清晰表述实际操作步骤,以下是一些答案的组合。

  1. 下载boost文件并将其解压到希望放置的位置。
  2. 在终端中导航到目录并运行./bootstrap.sh
  3. 完成后运行./bjam(这可能需要一段时间,您可以去抽根烟或泡杯咖啡)
  4. 打开Eclipse项目,进入Project > Properties > C/C++ Build > Settings
  5. 点击MacOS X C++ Linker > Libraries. 您将看到一个分屏窗口,顶部是“Libraries (-l)”选项。在此区域中添加boost_systemboost_filesystem。在底部区域中,应该是“Library Search Path (-L)”选项。在这里,您需要将路径放置到您提取的Boost下载文件夹中stage/lib目录的路径。路径类似如下图所示:alt text
  6. 点击GCC C++编译器 > Includes。这将是一个单面板,其中说'Include Paths (-I)',我认为它是一个大写字母I,因为字体很奇怪,也可能是小写字母L。无论如何,在该区域中添加保存Boost的路径,但不包括stage/lib部分。路径类似如下图所示:alt text

现在所有内容都应该可以编译了,如果您需要使用其他任何Boost库,只需将其添加到链接器的位置即可,Boost文件系统和Boost系统也是一样的。祝您愉快。


这正是我需要的,但适用于Linux操作系统。我导航到设置窗格,但唯一可用的选项卡是二进制解析器和错误解析器。有什么想法如何做到这一点吗?我在Red Hat Enterprise Linux上使用Eclipse 3.7.1。 - Alessandro
为了在 Mac 上进行后续的 Boost 构建(>1.5x),我需要在链接库选项中添加“-mt”。例如,如果我想要将 libboost_regex-mt.a 包含到链接器中,我会指定“boost_regex-mt”。 - Brett Bonner
我按照这个做法,但是出现了以下错误: ld: 1 duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [cpp] Error 1 - Abhishek Kannan

4

不确定在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-这是我最近尝试完整源代码构建的结果。 根据您获取boost的方式,这可能会有所不同。 我最近在我的Mac上重新安装了64位的boost,并没有太多时间来尝试它....


@rholmes 感谢您的帮助。我觉得现在更接近了。根据更新,还有其他想法吗? - Jacob Schoen
对于我的系统,库路径位于.../boost_1_45_0/stage/lib。 - rholmes
@rholmes 谢谢,干得好。顺便欢迎来到SO。希望将来我也能回报你的帮助。 - Jacob Schoen
@jschoen - 感谢欢迎!我在许多搜索中都遇到过SO - 很高兴我的评论有所帮助!顺便问一下 - 是否有链接可以查看SO接受的标记类型?标准维基格式吗?谢谢! - rholmes
@rholmes 我认为这里有大部分的标记 - http://stackoverflow.com/editing-help 还有一个FAQ列表在这里 http://meta.stackexchange.com/questions/tagged/faq。如果你对SO有其他问题,请查看Meta http://meta.stackoverflow.com,在那里你可以问关于SO或SO引擎的一般性问题。此外,如果你对SO的整个格式上瘾了,请查看Stackexchange以找到他们运营的一系列网站http://stackexchange.com/。享受吧! - Jacob Schoen
@jschoen 感谢提供的信息,顺便说一下,你的终极解决方案写得很好。 - rholmes

2
将boost_system和boost_filesystem一起加入链接器列表。

当我回到家的时候,我会在今晚试一下。之前我尝试过使用boost_filesystem和boost,但没有用过boost_system。也许这样做可以解决问题。 - Jacob Schoen
仍然无法,我甚至尝试在库搜索路径中添加我的系统上的boost。 - Jacob Schoen
最新的错误提示是找不到boost_system库,你有什么想法吗? - Jacob Schoen

0

我最近卸载了boost rpm并像你一样安装了Boost。在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的问题。一定是其他什么问题。


1
这是Eclipse的一个问题。错误是关于缺少函数的链接器错误。您需要告诉Eclipse链接到boost_filesystem库。我不了解Eclipse,但是如果使用gcc,您只需添加类似于“-L/path/to/boost/libs -lboost_filesystem”的内容即可。 - rve
其他使用boost的程序可以在不链接库的情况下工作,因为它们是仅包含头文件的库。 - rve
@rve 我会尝试一下Alex的建议,看看会发生什么。 @Nav 很高兴知道我不是唯一感到困惑的人。我认为我按照指示正确地操作了,但始终无法使其正常工作。 - Jacob Schoen

0

我最近在使用Eclipse和CDT时遇到了类似的问题...原来,在Ubuntu上使用apt-get安装libboost_system时,它会被安装为libboost_system.1.40.0在/usr/lib目录下。

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

所以,请听取我的建议,在使用apt-get install之后只需输入简单的"boost_system"即可。这将使一切变得非常容易。


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