21

您好我正在尝试与 boost 链接以使用线程库,但似乎无法构建它。

我用 HomeBrew(mac 包安装程序)安装了 boost,它在/usr/local/Cellar/boost/1.50.0目录中。

我的主文件现在很简单......

#include <iostream>
#include <boost/thread.hpp>

我的make文件是这样的:

CC = g++


BASE_FLAGS = -m32 -wAll

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR HEADERS
LDFLAGS = -I/usr/local/Cellar/boost/1.50.0/include -I/opt/local/include

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR LIB FILES
LLIBFLAGS = -L/usr/local/Cellar/boost/1.50.0/

# SPECIFIY LINK OPTIONS
LINKFLAGS = -l boost_thread-mt -lboost_system

# FINAL FLAGS -- TO BE USED THROUGHOUT
FLAGS = $(BASE_FLAGS) $(LLIBFLAGS) $(LDFLAGS) $(LINKFLAGS)




# NOTE FOR BOOST -- YOU ONLY NEED TO INCLUDE THE PATH BECAUSE IT ONLY INSTALLS HEADER FILES
main: main.cpp
    $(CC) $(FLAGS) -o main.out main.cpp

当我运行它时,我得到了一个找不到 boost_system 的库。如果我取出 boost_system,则会收到如下所示的错误:

ld: warning: ignoring file /usr/local/lib/libboost_thread-mt.dylib, file was built for unsupported file format ( 0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0 ) which is not the architecture being linked (i386): /usr/local/lib/libboost_thread-mt.dylib
Undefined symbols for architecture i386:
  "boost::system::system_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o
  "boost::system::generic_category()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
make: *** [main] Error 1
4

2 回答 2

18

如果您刚刚使用brew install boost没有选项,这将构建一个 64 位二进制文​​件 - 静态和动态。

上面代码的罪魁祸首是使用了-m32选项,删除它,你应该没问题。这意味着您正在尝试将 32 位构建链接到 64 位库。

Boost 库符号链接到/usr/local/Cellar/- (/usr/local/lib/usr/local/include) 中的实际二进制文件和头文件。你的 PATH 应该包括这些,所以不需要在你的 makefile 中指定这些。

请注意,brew(通过扩展 gcc)通常默认构建 64 位二进制文​​件,从您的错误输出中构建了 Boost 库。(您可以使用这些工具检查库的架构otoolfile或者lipo

于 2012-11-21T17:39:55.340 回答
12

正如 Jesse Good 所指出的,您的 -mt 后缀有问题。对于所有再次运行的人(即使在 Windows 上):

事实证明,-mt 后缀(代表多线程支持)不用于 Linux boost 安装,而是用于 Mac 和其他系统。Linux 上的 Boost 仍然支持多线程,这只是一个命名约定。另请参阅https://stackoverflow.com/a/2310892

这就是为什么您必须在 Mac 和 Windows 上的链接选项中的所有 boost 库中添加 -mt 后缀,而不是在 Linux 上。如果您正在与 Linux 合作开发者一起使用 CMake(就像我一样),您可以像这样修改 CMakeLists.txt:

if(APPLE OR WIN32)
    target_link_libraries([other libs..] boost_thread-mt boost_system-mt)
else()
    target_link_libraries([other libs..] boost_thread boost_system)
endif()
于 2013-02-23T12:10:44.643 回答