Ошибки компоновщика при использовании буст-сериализации - PullRequest
13 голосов
/ 04 января 2012

Я использую сериализацию Boost.Я скомпилировал с: -L/opt/local/lib -lboost_serialization -stdlib=libc++, но получил несколько ошибок (не для Google):

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-битный машинный код (так что я думаю, это не проблема):

$ 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

Я установил повышение, используя sudo port install boost +universal на Mac OS X 10.7.

Ответы [ 2 ]

17 голосов
/ 09 января 2012

Я мог бы воспроизвести проблему, используя следующий код:

#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++ связывание завершается неудачно, по сути, цитата из сообщений об ошибках (у меня Boost установлен на /opt/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
0 голосов
/ 04 января 2012

Похоже, что ваши библиотеки повышения могут быть 32-битными.

Эту проблему вы не заметите, пока не попробуете использовать одну из немногих утилит буста, которые не только для заголовков.

...