3

我正在使用 OSX Mountain Lion。我刚刚使用 boost 网站提供的说明下载、解压缩并构建了 boost 1.52.0:http: //www.boost.org/doc/libs/1_52_0/more/getting_started/unix-variants.html。我将默认的安装前缀保留在/usr/local,这意味着库安装在/usr/local/lib,头文件在/usr/local/include. 我已经验证了库和头文件在那里并且最近被修改过。

我正在尝试编译此处找到的 boost 异步 I/O 示例:http: //www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/tutorial/tuttimer5/src.html(来源)。

这是我的编译命令:

g++ -Wall -c -g -I/usr/local/include src/test1.cpp -o src/test1.o

其中 src/test1.cpp 是示例源文件。这是我的链接命令(和错误):

g++ -Wall -L/usr/local/lib -lboost_thread -lboost_system  src/test1.o -o bin/test1
Undefined symbols for architecture x86_64:
  "boost::thread::~thread()", referenced from:
      _main in test1.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

我尝试过使用 Apple 的 clang++ 4.0 和 g++ 4.6.0。我从两个程序中得到相同的未定义符号错误。

其他人似乎也无法编译此代码示例。我知道这个问题:C++ / Boost: Undefined Symbols in example?还有这个:编译 boost.asio 示例时出现链接器错误。但是,这些问题中的每一个似乎都已通过在命令行中添加适当的开关(-lboost_thread 和 -lboost_system)得到解决。我已经有了这些。我也试过添加 -lpthread 没有运气。

感谢您花时间看我的问题!任何帮助表示赞赏。:)

4

2 回答 2

0

将您最后链接的库放在命令行上。

GNU 链接器使用一种反向查找依赖项,因此如果文件 A 依赖于库 B,则 B 应该在命令行上位于 A之后。

于 2012-12-12T07:01:01.807 回答
0

刚遇到同样的问题,我发现恢复到 Boost 1.49 可以解决问题。Boost 1.49 的下载链接在这里:

http://www.boost.org/users/history/version_1_49_0.html

在安装 1.49 之前,我通过删除 1.52/usr/local/include/boost/usr/local/lib/*boost*. 不确定 1.49 和 1.52 之间发生了什么变化导致了这个问题,或者 Boost 1.50 或 1.51 是否可以工作。

于 2013-01-02T19:17:06.443 回答