繁体   English   中英

使用Boost序列化时的链接器错误

[英]Linker errors when using 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

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

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

我安装的Boost是否有问题?


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

\n $文件libboost_serialization.dylib\n libboost_serialization.dylib:具有2种体系结构的Mach-O通用二进制文件\n libboost_serialization.dylib(对于体系结构i386):Mach-O动态链接的共享库i386\n libboost_serialization.dylib(对于体系结构x86_64):Mach-O 64位动态链接的共享库x86_64\n

我在Mac OS X 10.7上使用sudo port install boost +universal

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

#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链接时,这可以-lboost_serialization编译和链接。 但是,当将clang++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安装指南使用构建一个构建:

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将内容安装到受保护的目录中。 显然,您可以将其安装到其他具有写权限的目录中。 我只是在机器上安装了东西,以防止意外弄乱它。

但是,完成此安装后,我可以成功构建程序:

/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

看来您的Boost库可能是32位的。

在尝试使用少数不是仅标头的boost utils之一之前,您不会注意到这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM