【问题标题】:Linker errors when using boost serialization使用 boost 序列化时的链接器错误
【发布时间】:2012-02-02 11:09:52
【问题描述】:

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

架构 x86_64 的未定义符号: “boost::archive::text_oarchive_impl::save(std::__1::basic_string, std::__1::allocator > const&)”,引用自: void boost::archive::save_access::save_primitive, std::__1::allocator > >(boost::archive::text_oarchive&, std::__1::basic_string, std::__1::allocator > const&) 在 main .o “boost::archive::basic_text_oprimitive > >::~basic_text_oprimitive()”,引用自: boost::archive::text_oarchive_impl::~text_oarchive_impl() 在 main.o “boost::archive::text_oarchive_impl::text_oarchive_impl(std::__1::basic_ostream >&, unsigned int)”,引用自: main.o 中的 boost::archive::text_oarchive::text_oarchive(std::__1::basic_ostream >&, unsigned int) ld:未找到架构 x86_64 的符号

我正在序列化一个std::vector<std::string>

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

我的 boost 安装有问题吗?


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

$ 文件 libboost_serialization.dylib libboost_serialization.dylib:具有 2 个架构的 Mach-O 通用二进制文件 libboost_serialization.dylib(用于 i386 架构):Mach-O 动态链接共享库 i386 libboost_serialization.dylib(用于架构 x86_64):Mach-O 64 位动态链接共享库 x86_64

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

【问题讨论】:

  • 也许 boost 是用与你使用的不同的编译器构建的?过去我在 macports 上遇到过类似的问题,但时间太长了,无法记住细节。
  • 你能发布一个小例子来展示你如何尝试使用序列化库吗?我没有使用过它,但我非常有信心,一旦我有一个有效的测试用例,我就可以追踪问题......(工作方式:显示问题)。

标签: c++ macos boost ld boost-serialization


【解决方案1】:

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

#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 链接时,这将毫无问题地编译和链接。但是,当使用 clang++libc++ 链接失败时,基本上会出现错误消息引用(我在 /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

我对@9​​87654331@ 所做的编辑几乎肯定不是那些预期的,但它们似乎起到了作用:我对“bjam”了解不多,我只是试图找到一个合适的位置来应用更改。安装的某些步骤使用sudo 将东西安装到受保护的目录中。显然,您也可以将其安装到您也具有写入权限的其他目录中。我只是在我的机器上安装了一些东西,以防止我不小心弄乱它。

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

/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

【讨论】:

  • 对我来说,我需要-I/opt/boost-clang 来编译。对我来说,在完成所有这些步骤之后,我仍然在链接阶段失败。 MacOS 10.13.6 高山脉。使用升压 1.69。对步骤稍作修改,但大体相同。
【解决方案2】:

看起来您的 boost 库可能是 32 位的。

这是一个你不会注意到的问题,除非你尝试使用少数非标头的 boost 实用程序之一。

【讨论】:

  • 运行命令“文件boost_ser.so”。它会告诉你是 32 位拱门还是 64 位拱门。
  • "libboost_serialization.dylib: Mach-O 64 位动态链接共享库 x86_64" mmm...
  • @WTP otool -vf libboost_serialization.dylib 显示什么?
  • 我遇到了这个问题。我在一个 64 位 mac 上,从 homebrew 安装了 64 位 boost。 otool 命令没有输出(我必须输入完整路径),对于file,我得到了lib: Mach-O 64-bit dynamically linked shared library x86_64
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多