2011-04-06 17 views
7

Pregunta de novato ... Estoy probando Boost por primera vez porque quiero probar la biblioteca Boost Log. Construí este programa de prueba ...referencia indefinida para `boost :: log_mt_posix :: basic_attribute_set <char> :: ~ basic_attribute_set() '

#include <boost/log/trivial.hpp> 
#include <iostream> 

int fibonacci(int num) { 
    int i; 
    int a = 1; 
    int b = 1; 

    for (i = 2; i <= num; ++i) { 
     BOOST_LOG_TRIVIAL(info) << "Iteration " << i << " (a = " << a << ", b = " << b << ")..."; 
     b = a + b; 
     a = b - a; 
    } 

    return a; 
} 

int main() { 
    std::cout << "8th fibonacci number: " << fibonacci(8) << std::endl; 
    return 0; 
} 

de compilación de datos:

**** Build of configuration Debug for project LoggingCpp **** 

make all 
Building file: ../main.cpp 
Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -lpthread -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" 
Finished building: ../main.cpp 

Building target: LoggingCpp 
Invoking: GCC C++ Linker 
g++ -lpthread -o"LoggingCpp" ./main.o 
./main.o: In function `~basic_logger': 
/usr/include/boost/log/sources/basic_logger.hpp:90: undefined reference to `boost::log_mt_posix::basic_attribute_set<char>::~basic_attribute_set()' 
./main.o: In function `boost::log_mt_posix::trivial::logger::construct_logger()': 
/usr/include/boost/log/trivial.hpp:102: undefined reference to `boost::log_mt_posix::trivial::aux::init()' 
./main.o: In function `void boost::call_once<void (*)()>(boost::once_flag&, void (*)())': 
/usr/include/boost/thread/pthread/once.hpp:51: undefined reference to `boost::detail::get_once_per_thread_epoch()' 
/usr/include/boost/thread/pthread/once.hpp:55: undefined reference to `boost::detail::once_epoch_mutex' 
/usr/include/boost/thread/pthread/once.hpp:66: undefined reference to `boost::detail::once_epoch_mutex' 
/usr/include/boost/thread/pthread/once.hpp:77: undefined reference to `boost::detail::once_global_epoch' 
/usr/include/boost/thread/pthread/once.hpp:77: undefined reference to `boost::detail::once_global_epoch' 
/usr/include/boost/thread/pthread/once.hpp:77: undefined reference to `boost::detail::once_global_epoch' 
/usr/include/boost/thread/pthread/once.hpp:78: undefined reference to `boost::detail::once_epoch_cv' 
/usr/include/boost/thread/pthread/once.hpp:84: undefined reference to `boost::detail::once_epoch_mutex' 
/usr/include/boost/thread/pthread/once.hpp:84: undefined reference to `boost::detail::once_epoch_cv' 
/usr/include/boost/thread/pthread/once.hpp:88: undefined reference to `boost::detail::once_global_epoch' 
/usr/include/boost/thread/pthread/once.hpp:73: undefined reference to `boost::detail::once_epoch_cv' 
./main.o: In function `record_pump': 
/usr/include/boost/log/sources/record_ostream.hpp:293: undefined reference to `boost::log_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log_mt_posix::basic_record<char> const&)' 
./main.o: In function `~auto_release': 
/usr/include/boost/log/sources/record_ostream.hpp:280: undefined reference to `boost::log_mt_posix::aux::stream_provider<char>::release_compound(boost::log_mt_posix::aux::stream_provider<char>::stream_compound*)' 
./main.o: In function `boost::log_mt_posix::sources::aux::logger_singleton<boost::log_mt_posix::trivial::logger>::init_instance()': 
/usr/include/boost/log/sources/global_logger_storage.hpp:126: undefined reference to `boost::log_mt_posix::sources::aux::global_storage<char>::get_or_init(std::type_info const&, boost::function0<boost::shared_ptr<boost::log_mt_posix::sources::aux::logger_holder_base> > const&)' 
/usr/include/boost/log/sources/global_logger_storage.hpp:147: undefined reference to `boost::log_mt_posix::odr_violation::throw_(char const*, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
./main.o: In function `boost::log_mt_posix::sources::aux::severity_level<boost::log_mt_posix::trivial::severity_level>::set_value(boost::log_mt_posix::trivial::severity_level)': 
/usr/include/boost/log/sources/severity_feature.hpp:95: undefined reference to `boost::log_mt_posix::sources::aux::set_severity_level(int)' 
./main.o: In function `boost::log_mt_posix::basic_record<char> boost::log_mt_posix::sources::basic_logger<char, boost::log_mt_posix::sources::severity_logger_mt<boost::log_mt_posix::trivial::severity_level>, boost::log_mt_posix::sources::multi_thread_model<boost::log_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log_mt_posix::keywords::tag::severity, boost::log_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log_mt_posix::keywords::tag::severity, boost::log_mt_posix::trivial::severity_level const> const&)': 
/usr/include/boost/log/sources/basic_logger.hpp:269: undefined reference to `boost::log_mt_posix::basic_core<char>::open_record(boost::log_mt_posix::basic_attribute_set<char> const&)' 
./main.o: In function `boost::log_mt_posix::sources::basic_logger<char, boost::log_mt_posix::sources::severity_logger_mt<boost::log_mt_posix::trivial::severity_level>, boost::log_mt_posix::sources::multi_thread_model<boost::log_mt_posix::aux::light_rw_mutex> >::push_record_unlocked(boost::log_mt_posix::basic_record<char> const&)': 
/usr/include/boost/log/sources/basic_logger.hpp:280: undefined reference to `boost::log_mt_posix::basic_core<char>::push_record(boost::log_mt_posix::basic_record<char> const&)' 
./main.o: In function `basic_logger<boost::parameter::aux::tagged_argument<boost::log_mt_posix::keywords::tag::severity, const boost::log_mt_posix::trivial::severity_level> >': 
/usr/include/boost/log/sources/basic_logger.hpp:145: undefined reference to `boost::log_mt_posix::basic_core<char>::get()' 
/usr/include/boost/log/sources/basic_logger.hpp:145: undefined reference to `boost::log_mt_posix::basic_attribute_set<char>::basic_attribute_set()' 
./main.o: In function `~pair': 
/usr/include/c++/4.5/bits/stl_pair.h:72: undefined reference to `boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> >::~basic_slim_string()' 
/usr/include/c++/4.5/bits/stl_pair.h:72: undefined reference to `boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> >::~basic_slim_string()' 
./main.o: In function `basic_logger': 
/usr/include/boost/log/sources/basic_logger.hpp:135: undefined reference to `boost::log_mt_posix::basic_core<char>::get()' 
/usr/include/boost/log/sources/basic_logger.hpp:135: undefined reference to `boost::log_mt_posix::basic_attribute_set<char>::basic_attribute_set(boost::log_mt_posix::basic_attribute_set<char> const&)' 
./main.o: In function `boost::log_mt_posix::basic_attribute_set<char>::reference_proxy::operator=(boost::shared_ptr<boost::log_mt_posix::attribute> const&) const': 
/usr/include/boost/log/attributes/attribute_set.hpp:121: undefined reference to `boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> >::basic_slim_string(char const*, unsigned long)' 
/usr/include/boost/log/attributes/attribute_set.hpp:121: undefined reference to `boost::log_mt_posix::basic_attribute_set<char>::insert(boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> > const&, boost::shared_ptr<boost::log_mt_posix::attribute> const&)' 
/usr/include/boost/log/attributes/attribute_set.hpp:121: undefined reference to `boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> >::~basic_slim_string()' 
/usr/include/boost/log/attributes/attribute_set.hpp:121: undefined reference to `boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> >::~basic_slim_string()' 
./main.o: In function `pair<std::basic_string<char>, boost::shared_ptr<boost::log_mt_posix::attribute> >': 
/usr/include/c++/4.5/bits/stl_pair.h:116: undefined reference to `boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> >::basic_slim_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
./main.o: In function `boost::log_mt_posix::basic_attribute_set<char>::insert(std::pair<boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> > const, boost::shared_ptr<boost::log_mt_posix::attribute> > const&)': 
/usr/include/boost/log/attributes/attribute_set.hpp:507: undefined reference to `boost::log_mt_posix::basic_attribute_set<char>::insert(boost::log_mt_posix::basic_slim_string<char, std::char_traits<char> > const&, boost::shared_ptr<boost::log_mt_posix::attribute> const&)' 
./main.o: In function `boost::log_mt_posix::sources::aux::severity_level<boost::log_mt_posix::trivial::severity_level>::dispatch(boost::log_mt_posix::type_dispatcher&)': 
/usr/include/boost/log/sources/severity_feature.hpp:105: undefined reference to `boost::log_mt_posix::sources::aux::get_severity_level()' 
./main.o: In function `boost::log_mt_posix::sources::aux::severity_level<boost::log_mt_posix::trivial::severity_level>::detach_from_thread()': 
/usr/include/boost/log/sources/severity_feature.hpp:118: undefined reference to `boost::log_mt_posix::sources::aux::get_severity_level()' 
collect2: ld returned 1 exit status 
make: *** [LoggingCpp] Error 1 

About Boost Log syntax

¿Me instalo Boost Acceder de forma incorrecta? ¿Me estoy perdiendo bibliotecas cruciales? ¿He omitido las banderas del enlazador necesarias?

Respuesta

0

Parece que no ha creado el registro?

Una vez que haya copiado los archivos del encabezado del registro, etc. en las carpetas correspondientes en su distribución de refuerzo (mantenga la misma estructura, es decir, combine los encabezados, la carpeta libs en la carpeta libs de su distribución de refuerzo, etc.) , aún necesita aumentar el impulso y luego, como mencionó John, vincularlo. Es por eso que el enlace al que te referiste anteriormente te indica las instrucciones de refuerzo estándar.

Hace un tiempo, pero AFAIR en Linux simplemente ejecuta ./bjam en la raíz de su carpeta de impulso.

+0

bjam en el directorio raíz falla: 'Imposible cargar Boost.Build: no se pudo encontrar" boost-build.jam "'. 'libs/log' contiene algunos subdirectorios, incluidos' build', 'src' y' doc', por lo que no creo que pueda copiar sus contenidos en '/ usr/lib64'. – Pieter

+0

Lo que quise decir es que ha descargado una versión de boost de sourceforge y la ha extraído en algún lugar de su disco, p./home/usuario/boost_1_46. Boost tiene una estructura de carpeta específica. Si descargas log y lo extraes, tiene una estructura similar. Así que copie todos los archivos desde el dir de inicio de sesión/impulso a/home/user/boost_1_46/boost. Copie los archivos en logdir/libs a/home/user/boost_1_46/libs, y así sucesivamente. Una vez que haya hecho eso, invoque bjam como se indica en 5.1 http://www.boost.org/doc/libs/1_46_0/more/getting_started/unix-variants.html Si invoca ./bjam install, los archivos lib se copiarán a su directorio lib – Ralf

+0

Desinstalé Boost, Boost recién extraído de su '.tar.bz2' y Boost Log de su' .zip'. Copié los directorios desde Boost Log al directorio raíz de Boost, luego hice './Bjam' y' ./bjam install'. El compilador todavía no está contento. http://pastebin.com/xTLQu9Cf – Pieter

1

Necesita agregar algo como -lboost-log-mt a su línea de enlace.

+0

¿Cómo sé el nombre de las banderas que necesito agregar? ('-lboost-log-mt' no es reconocido por el enlazador.) – Pieter

+0

Pruebe esto:' ls/usr/lib/libboost * log * 'y publique qué archivos encuentra. Es posible que el nombre de la biblioteca haya sido incorrecto para usted, pero la opción -l es válida para gcc, como lo muestra su propio uso de '-lpthread'. –

+0

'ls: no se puede acceder/usr/lib/libboost * log *: No existe dicho archivo o directorio' ... Ya temía que fuera un problema de instalación. Copié '/ boost/log' a'/usr/include/boost/'pero no sabía que se necesitaban archivos adicionales. Sus instrucciones de instalación (http://boost-log.sourceforge.net/libs/log/doc/html/log/installation.html) son un poco vagas ... – Pieter

0

Quizás cambie la versión incorrecta de boost_log.

que tienen el mismo número de referencia indefinida a "impulsar :: Entre :: v2_mt_posix :: :: núcleo push_record_move (boost :: log :: :: v2_mt_posix registro &)"

construyo el libboost_log por mi cuenta Y utilizo la nm a grep la push_record_move encontró que, "boost :: :: ingrese v2s_mt_posix :: :: núcleo push_record_move (boost :: log :: :: v2s_mt_posix registro &)"

De la experiencia de antes, debería agregar algunos cflag en el Makefile.