Ошибки компоновщика при использовании ускоренной сериализации

Я использую ускоренную сериализацию. Я скомпилировал: -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 - это универсальные двоичные файлы, содержащие как 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.


person Community    schedule 04.01.2012    source источник
comment
Может быть, boost был построен с другим компилятором, чем тот, который вы используете? У меня были аналогичные проблемы с macports в прошлом, но я слишком давно не помню подробностей.   -  person ergosys    schedule 08.01.2012
comment
Можете ли вы опубликовать небольшой пример, показывающий, как вы пытаетесь использовать библиотеку сериализации? Я не использовал его, но вполне уверен, что смогу отследить проблему, когда у меня будет рабочий тестовый пример ... (работа как в: показывает проблему).   -  person Dietmar Kühl    schedule 09.01.2012


Ответы (2)


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

#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
person Dietmar Kühl    schedule 08.01.2012
comment
Мне потребовалось -I/opt/boost-clang для компиляции. Что касается меня, я все еще терплю неудачу на этапе связывания после выполнения всех этих шагов. MacOS 10.13.6 High Sierra. Использование Boost 1.69. Небольшие изменения в ступенях, но в основном такие же. - person Joe Flack; 20.12.2019

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

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

person Drew Dormann    schedule 04.01.2012
comment
Запустите командный файл boost_ser .so. Он скажет вам, для 32-битной или 64-битной архитектуры. - person Arunmu; 04.01.2012
comment
libboost_serialization.dylib: 64-битная динамически подключаемая разделяемая библиотека Mach-O x86_64 ммм… - person ; 04.01.2012
comment
@WTP Что отображает otool -vf libboost_serialization.dylib? - person Drew Dormann; 08.01.2012
comment
У меня такая проблема. Я нахожусь на 64-битном Mac с 64-битной установкой ускорения из homebrew. Я не получил вывода от команды otool (мне пришлось ввести полный путь), а для file я получил lib: Mach-O 64-bit dynamically linked shared library x86_64 - person Joe Flack; 19.12.2019