2011-04-28 15 views
6

El ejemplo que estoy tratando de compilar es de: http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html (el ejemplo de chat)C++/Boost: Símbolos indefinidos en el ejemplo?

Esto es lo que estoy usando para hacerlo:

>>> g++ chat_client.cpp chat_message.hpp 
>>> g++ chat_server.cpp chat_message.hpp 

Esto es lo que el terminal emite:

% g++ chat_client.cpp chat_message.hpp 
In file included from chat_client.cpp:17: 
chat_message.hpp: In member function ‘void chat_message::encode_header()’: 
chat_message.hpp:84: warning: format ‘%4d’ expects type ‘int’, but argument 3 has type ‘size_t’ 
ld: warning: in chat_message.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols: 
    "boost::system::generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in cctJA2c1.o 
     __static_initialization_and_destruction_0(int, int)in cctJA2c1.o 
    "boost::thread::start_thread()", referenced from: 
     boost::thread::thread<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >(boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >, boost::disable_if<boost::is_convertible<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >&, boost::detail::thread_move_t<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > > >, boost::thread::dummy*>::type)in cctJA2c1.o 
    "boost::thread::join()", referenced from: 
     _main in cctJA2c1.o 
    "typeinfo for boost::detail::thread_data_base", referenced from: 
     typeinfo for boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >in cctJA2c1.o 
    "vtable for boost::detail::thread_data_base", referenced from: 
     boost::detail::thread_data_base::thread_data_base()in cctJA2c1.o 
    "boost::thread::~thread()", referenced from: 
     _main in cctJA2c1.o 
     _main in cctJA2c1.o 
    "boost::detail::thread_data_base::~thread_data_base()", referenced from: 
     boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data()in cctJA2c1.o 
     boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data()in cctJA2c1.o 
    "boost::system::system_category()", referenced from: 
     boost::system::get_system_category()  in cctJA2c1.o 
     boost::system::error_code::error_code()in cctJA2c1.o 
     __static_initialization_and_destruction_0(int, int)in cctJA2c1.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
  • Boost está instalado correctamente. Tengo otra aplicación que usa un par de características de bits de mejora.

ACTUALIZACIÓN: este es el comando actual que estoy usando:

% g++ chat_client.cpp chat_message.hpp -lboost_asio -lboost_thread -o client -L/opt/local/lib/ 

dice que no puede encontrar -lboost_asio

Miré en opt/local/lib (donde es impulso instalado) y no veo ningún libboost_asio.so ni nada de eso = \

Respuesta

14

Debe proporcionar las librerías g ++ boost para vincular con la opción us -l. Echo un vistazo rápido a estos ejemplos y supongo que definitivamente necesitas la biblioteca thread. Puede enlazar con él utilizando

g++ source.cpp -o executable -lboost_thread 

También es posible que necesite con boost_system biblioteca utilizando

g++ source.cpp -o executable -lboost_thread -lboost_system 
+0

añadiendo -lboost no funciona ... dice que no se encuentra la biblioteca. Instalé boost usando el administrador de paquetes de mi terminal ... entonces ... sé que lo tengo. + mi otra aplicación funciona con ella ... aunque no usamos -lboost con eso tampoco ... – NullVoxPopuli

+0

En la opción -l debe especificar no solo boost, sino el nombre de la biblioteca de boost utilizada. Por ejemplo, cuando su aplicación usa la biblioteca de subprocesos (una con el nombre 'libboost_thread.so') debe especificar' -lboost_thread'. – beduin

+0

actualización agregada. Realmente no estoy seguro de qué libs necesito. Desearía que esto se documentara en algún lugar – NullVoxPopuli

Cuestiones relacionadas