2012-01-04 16 views
12

Estoy usando la serialización de impulso. He compilado con: -L/opt/local/lib -lboost_serialization -stdlib=libc++, pero tengo varios errores (ungooglable):Errores del vinculador al usar la serialización de impulso

 
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 

estoy serializar un std::vector<std::string>:

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

¿Existe un problema con mi instalación de impulso?


Las bibliotecas Boost son binarios universales que contienen tanto el código máquina de 32 bits y de 64 bits (de modo que no es el problema, supongo):

 
$ 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 

he instalado impulso usando sudo port install boost +universal en Mac OS X 10.7.

+0

Tal impulso fue construido con diferentes compilador que lo que se está utilizando? Tuve problemas similares con macports en el pasado, pero hace mucho tiempo para recordar los detalles. – ergosys

+0

¿Puedes publicar un pequeño ejemplo que muestre cómo estás tratando de usar la biblioteca de serialización? No lo he usado, pero estoy bastante seguro de poder rastrear el problema una vez que tengo un caso de prueba en funcionamiento ... (trabajando como en: muestra el problema). –

Respuesta

16

que podía reproducir el problema usando el siguiente código:

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

Este compila y enlaces sin problemas al usar g++ o clang++ con sus banderas respectivas predeterminadas y la vinculación con -lboost_serialization. Sin embargo, cuando se utiliza clang++ con libc++ vinculación falla con esencialmente la cita de mensajes de error (He impulso instalado en /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 

En base a esta Supuse que una acumulación con -stdlib = libC++ quiere tener su propio Boost construir y construir uno usando basan en el 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 

los cambios que realicé a clang-darwin.jam están casi seguro que no las destinadas pero parecen hacer el truco: no sé mucho acerca de "bjam" y acabo intentado encontrar una ubicación adecuada para aplicar el cambio Algunos pasos de la instalación usan sudo para instalar cosas en directorios protegidos. Obviamente, puede instalarlo en otro directorio donde también tenga permisos de escritura. Acabo de instalar cosas en mi máquina de una manera que evita que la estropee accidentalmente.

Sin embargo, con esta instalación en el lugar que podría construir con éxito el programa:

/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

Parece que sus bibliotecas de impulso pueden ser de 32 bits.

Ese es un problema que no notaría hasta que haya intentado utilizar uno de los pocos servicios de impulso que no son solo de encabezado.

+0

Estoy reinstalando boost con binarios universales. brb –

+2

Ejecute el comando "file * boost_ser * .so". Le dirá si es para arco de 32 bits o arco de 64 bits. – Arunmu

+0

"libboost_serialization".dylib: biblioteca compartida Mach-O de 64 bits vinculada dinámicamente x86_64 "mmm ... –

Cuestiones relacionadas