使用g ++链接到32位boost库的错误

时间:2014-11-07 12:54:26

标签: boost linker g++

我正在Mac OSX中创建一个项目并使用boost编译库(序列化等)。我将所有依赖项安装为x86_64库,但现在想要显式地制作32位(i386)并为32位用户重新编译我的项目。

我已经使用g++ -m32在适当的位置重新编译了库,然后使用

重新编写了32位的boost库
./bootstrap.sh link=static
./b2 cflags=-m32 cxxflags=-m32 address-model=32 threading=multi architecture=x86 instruction-set=i686

然后我通过显式链接到32位库来重新编译我的项目。像

这样的东西
g++ file.cpp /usr/local/lib/boost_i386/libboost_serialization.a -m32 -o executable

其中库明确地使用otool验证32位版本,如下所示(部分)输出(所有列表cputype为i386)

otool -hv -arch all libboost_serialization.a
Archive : libboost_serialization.a
libboost_serialization.a(basic_archive.o):
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
   MH_MAGIC    I386        ALL  0x00      OBJECT     3       1180 SUBSECTIONS_VIA_SYMBOLS

但是,当我编译我的项目时(尽管大多数依赖项工作正常),它会跳闸并且此架构缺少符号

显式:

Undefined symbols for architecture i386:
  "boost::archive::detail::shared_ptr_helper::shared_ptr_helper()", referenced from:
      boost::archive::binary_iarchive::binary_iarchive(std::basic_istream<char, std::char_traits<char> >&, unsigned int)in ccCH1ama.o
  "boost::archive::detail::shared_ptr_helper::~shared_ptr_helper()", referenced from:
      boost::archive::binary_iarchive::~binary_iarchive()in ccCH1ama.o
      boost::archive::binary_iarchive::~binary_iarchive()in ccCH1ama.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

我已经明确地构建了32位库,检查它们实际上是32位,并明确链接到它们,我不知道还能做什么。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

原来头文件是boost v1.55,但i386库使用的是最新版本v1.57。这导致了错误。使用旧的v1.55构建库以匹配标题解决问题。