2012-01-04 14 views
12

Sto usando la serializzazione boost. Ho compilato con: -L/opt/local/lib -lboost_serialization -stdlib=libc++, ma ho ottenuto diversi errori (ungooglable):Errori del linker quando si utilizza la serializzazione boost

 
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 

sto serializzazione di un std::vector<std::string>:

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

c'è un problema con la mia installazione di spinta?


Le librerie Boost sono file binari universali che contengono sia il codice macchina a 32-bit e 64-bit (in modo che non è questo il problema credo):

 
$ 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 

ho installato spinta utilizzando sudo port install boost +universal su Mac OS X 10.7.

+0

Forse spinta è stata costruita con il compilatore diverso da quello che si sta utilizzando? Ho avuto problemi simili con i macport in passato, ma troppo tempo fa per ricordare i dettagli. – ergosys

+0

Puoi pubblicare un piccolo esempio che mostra come stai tentando di utilizzare la libreria di serializzazione? Non l'ho usato, ma sono abbastanza sicuro di poter rintracciare il problema una volta che ho un caso di test di lavoro ... (funzionando come in: mostra il problema). –

risposta

16

ho potuto riprodurre il problema utilizzando il seguente codice:

#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; 
} 

Questo compila e link senza problemi quando si utilizza g++ o clang++ con le loro rispettive bandiere di default e che collega -lboost_serialization. Tuttavia, quando si utilizza clang++ con libc++ collegamento fallisce con essenzialmente i messaggi di errore citazione (ho spinta installato presso /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 

Sulla base di questo ho pensato che una build con -stdlib = libC++ vuole avere un proprio Boost costruire e costruire uno usando basano sulla 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 

le modifiche che ho fatto a clang-darwin.jam sono quasi certamente non quelli destinati ma sembrano fare il trucco: io non so molto di "bjam" e ho appena cercato di trovare una posizione appropriata per applica la modifica. Alcuni passaggi dell'installazione utilizzano sudo per installare elementi in directory protette. Ovviamente, puoi installare in qualche altra directory dove hai anche i permessi di scrittura. Ho appena installato le cose sulla mia macchina in un modo che mi impedisce di rovinare accidentalmente.

Tuttavia, con questa installazione sul posto ho potuto costruire con successo il programma:

/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

Sembra che le librerie di boost possano essere a 32 bit.

Questo è un problema che non si noterà fino a quando non si è tentato di utilizzare uno dei pochi utils di boost che non sono solo di intestazione.

+0

Sto reinstallando boost con binari universali. brb –

+2

Esegui il comando "file * boost_ser * .so". Ti dirà se è per 32 bit arch o 64 bit arch. – Arunmu

+0

"libboost_serialization.dylib: Libreria condivisa dinamicamente collegata a 64 bit di Mach-O x86_64 "mmm ... –

Problemi correlati