链接Boost(Homebrew)Mac c ++

Jon*_*use 19 c++ boost makefile g++

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

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

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

#include <iostream>
#include <boost/thread.hpp>
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我找到了一个找不到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
Run Code Online (Sandbox Code Playgroud)

小智 18

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

你上面的代码的主要罪魁祸首是使用-m32选项,删除它,你应该没问题.这意味着您尝试将32位版本与64位库链接.

Boost库与/usr/local/Cellar/- (/usr/local/lib/usr/local/include)中的实际二进制文件和标题符号链接.您的PATH应包含这些,因此无需在makefile中指定这些.

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

  • 如果他**想要为32位构建怎么办? (4认同)

orz*_*how 11

如Jesse Good所示,您遇到-mt后缀问题.对于所有再次运行(甚至在Windows上):

事实证明,在Linux升级安装中不使用-mt后缀(代表多线程支持),而是在Mac和其他设备上使用.Linux上的Boost仍然支持多线程,它只是一个命名约定.另请参阅/sf/answers/161762471/.

这就是为什么你必须在Mac和Windows上的链接选项中为所有升级库添加-mt后缀,而不是在Linux上.如果您使用CMake与Linux共同开发人员(就像我一样),您可以像这样修改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()
Run Code Online (Sandbox Code Playgroud)