Я мог бы воспроизвести проблему, используя следующий код:
#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