c++ - 使用 boost 序列化时的链接器错误

标签 c++ macos boost ld boost-serialization

我正在使用 boost 序列化。我使用:-L/opt/local/lib -lboost_serialization -stdlib=libc++ 进行编译,但出现了几个(不可搜索的)错误:

Undefined symbols for architecture x86_64:
  "boost::archive::text_oarchive_impl::save(std::__1::basic_string, std::__1::allocator > const&)", referenced from:
      void boost::archive::save_access::save_primitive, std::__1::allocator > >(boost::archive::text_oarchive&, std::__1::basic_string, std::__1::allocator > const&) in main.o
  "boost::archive::basic_text_oprimitive > >::~basic_text_oprimitive()", referenced from:
      boost::archive::text_oarchive_impl::~text_oarchive_impl() in main.o
  "boost::archive::text_oarchive_impl::text_oarchive_impl(std::__1::basic_ostream >&, unsigned int)", referenced from:
      boost::archive::text_oarchive::text_oarchive(std::__1::basic_ostream >&, unsigned int) in main.o
ld: symbol(s) not found for architecture x86_64

I am serializing an std::vector<std::string>:

boost::archive::text_oarchive oa(std::cout);
oa << tasks;

我的 boost 安装有问题吗?


boost 库是包含 32 位和 64 位机器代码的通用二进制文件(所以我猜这不是问题):

$ file libboost_serialization.dylib
libboost_serialization.dylib: Mach-O universal binary with 2 architectures
libboost_serialization.dylib (for architecture i386): Mach-O dynamically linked shared library i386
libboost_serialization.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64

我在 Mac OS X 10.7 上使用 sudo port install boost +universal 安装了 boost。

最佳答案

我可以使用以下代码重现该问题:

#include "boost/archive/text_oarchive.hpp"
#include "boost/serialization/vector.hpp"
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> tasks;
    boost::archive::text_oarchive oa(std::cout);
    oa << tasks;
}

当使用 g++clang++ 及其各自的默认标志并使用 -lboost_serialization 链接时,这可以毫无问题地编译和链接。但是,当使用带有 libc++clang++ 链接失败时,基本上会出现错误消息引用(我在 /opt/boost 安装了 Boost):

clang++ -c -stdlib=libc++ -I/opt/boost -W -Wall -ansi serialize.cpp
clang++ -o serialize.tsk -L/opt/boost/stage/lib -stdlib=libc++ serialize.o -lboost_serialization

基于此,我假设带有 -stdlib=libc++ 的构建想要拥有自己的 Boost 构建并使用基于 Boost installation guide 的构建:

tar jxvf ~/Downloads/boost_1_48_0.tar.bz2
cd boost_1_48_0/tools/build/v2

# change the build rules to use -stdlib=libc++:
mv tools/clang-darwin.jam tools/clang-darwin.jam.orig
sed -e 's/CONFIG_COMMAND)"/CONFIG_COMMAND)" -stdlib=libc++/' < tools/clang-darwin.jam.orig > tools/clang-darwin.jam

./boostrap.sh
sudo ./b2 install --prefix=/opt/boost-clang
cd ../../..
/opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang stage
sudo /opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang install --prefix=/opt/boost-clang

我对 clang-darwin.jam 所做的编辑几乎可以肯定不是那些预期的,但它们似乎起到了作用:我对“bjam”知之甚少,我只是试图找到应用更改的适当位置。安装的某些步骤使用 sudo 将东西安装到 protected 目录中。显然,您也可以安装到您也具有写入权限的其他目录中。我只是在我的机器上安装了一些东西,以防止我不小心弄乱它。

然而,有了这个安装,我可以成功地构建程序:

/opt/llvm/bin/clang++ -stdlib=libc++ -W -Wall -ansi -I/opt/boost-clang  -c -o serialize.o serialize.cpp
/opt/llvm/bin/clang++ -stdlib=libc++ -L/opt/boost-clang/lib serialize.o -lboost_serialization -o serialize.tsk

关于c++ - 使用 boost 序列化时的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728742/

相关文章:

C++:在按 ENTER 之前读取字符

c++ - 输出二维字符串数组时出现段错误

macos - pkg-config:PKG_PROG_PKG_CONFIG:找不到命令

c++ - 清除 ptr_array

c++使用声明关键字用法在Boost库的示例中看到

c++ - boost time_duration 总秒数计算

c++ - 在 const 成员初始化之前使用,这是 gcc 和 clang 的预期行为吗?

c++ - 会使用 goto 泄漏变量吗?

python - 无法在 Mac 上安装 Twisted 17.1.0

objective-c - 使用最新的 xcode/OSX 版本构建项目时出现奇怪的应用程序行为