library instalar bibliotecas c++ boost fedora ld

c++ - instalar - Error de enlazador al vincular tutorial de registro de impulso(referencias no definidas)



instalar boost linux (9)

Alguien agregará agregar el cflag BOOST_LOG_DYN_LINK. Creo que no es toda la verdad.

Para usar libboost_log, debe conocer el cxxflag de la biblioteca cuando se compila. Quizás el indicador BOOST_LOG_DYN_LINK no se haya agregado a la compilación.

Debe cuidar el archivo boost / log / detail / config.hpp sobre BOOST_LOG_VERSION_NAMESPACE.

De todos modos, debe mantener el mismo boost_log_version_namespace con el libboost_log vinculado.

Para verificar boost_log_version_namespace puede usar el comando: nm -C libboost_log | grep push_record_move

push_record_move es una función de boost_log, saldrá, como este, boost :: log :: v2s_mt_posix :: core :: push_record_move (boost :: log :: v2s_mt_posix :: record &)

v2s_mt_posix es el espacio de nombres boost_log_version_namespace.

He instalado boost en Fedora 20 a través de yum y estoy probando algunos ejemplos simples. Sin embargo, tengo problemas para compilar el primer ejemplo del tutorial de registro .

La compilación con g++ -c boosttest.cc funciona bien, pero obtengo muchos errores cuando intento vincularla con

g++ boosttest.o -o boosttest -lboost_log -lpthread

el registro de error completo:

boosttest.o: In function `main'': boosttest.cc:(.text+0x44): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'' boosttest.cc:(.text+0x9a): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'' boosttest.cc:(.text+0x167): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'' boosttest.cc:(.text+0x1bd): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'' boosttest.cc:(.text+0x28a): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'' boosttest.o:boosttest.cc:(.text+0x2e0): more undefined references to `boost::log::v2s_mt_posix::trivial::logger::get()'' follow boosttest.o: In function `boost::log::v2s_mt_posix::record::reset()'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix6record5resetEv[_ZN5boost3log12v2s_mt_posix6record5resetEv]+0x18): undefined reference to `boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)'' boosttest.o: In function `boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<boost::log::v2s_mt_posix::trivial::severity_level>, void, void, void, void, void, void, void, void, void> >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> const&)'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresINS2_8severityIS6_EEvvvvvvvvvEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_[_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresINS2_8severityIS6_EEvvvvvvvvvEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_]+0x1e): undefined reference to `boost::log::v2s_mt_posix::core::get_logging_enabled() const'' boosttest.o: In function `boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::~record_pump()'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEED2Ev[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEED5Ev]+0x2c): undefined reference to `boost::log::v2s_mt_posix::aux::unhandled_exception_count()'' boosttest.o: In function `boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>&, boost::log::v2s_mt_posix::record&)'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC2ERS8_RNS1_6recordE[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC5ERS8_RNS1_6recordE]+0x1d): undefined reference to `boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&)'' boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC2ERS8_RNS1_6recordE[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC5ERS8_RNS1_6recordE]+0x28): undefined reference to `boost::log::v2s_mt_posix::aux::unhandled_exception_count()'' boosttest.o: In function `boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::auto_release::~auto_release()'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEE12auto_releaseD2Ev[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEE12auto_releaseD5Ev]+0xf): undefined reference to `boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*)'' boosttest.o: In function `boost::log::v2s_mt_posix::sources::aux::severity_level<boost::log::v2s_mt_posix::trivial::severity_level>::set_value(boost::log::v2s_mt_posix::trivial::severity_level)'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_[_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_]+0x7): undefined reference to `boost::log::v2s_mt_posix::sources::aux::get_severity_level()'' boosttest.o: In function `boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> const&)'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_[_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_]+0x2a): undefined reference to `boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&)'' boosttest.o: In function `boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::push_record_unlocked(boost::rv<boost::log::v2s_mt_posix::record>&)'': boosttest.cc:(.text._ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20push_record_unlockedERNS_2rvINS1_6recordEEE[_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20push_record_unlockedERNS_2rvINS1_6recordEEE]+0x36): undefined reference to `boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&)'' collect2: error: ld returned 1 exit status

¿Qué me estoy perdiendo? ¿Qué estoy haciendo mal?

EDIT 1: El orden de -lboost_log -lpthread no hace diferencia en la salida. También hay una pregunta muy similar , pero la solución no funciona para mí. Lo siguiente también falla con los mismos errores:

g++ -DBOOST_LOG_DYN_LINK boosttest.o -o boosttest -lboost_log -lpthread


Mira la respuesta de Mark Lakata en Boost logger linking issue

Mi problema, y ​​probablemente el problema de Michael, es la presencia de ambos .dylib y .a en / usr / local / lib. Como no tengo planeado vincular el boost de forma dinámica, al ejecutar sudo rm -f /usr/local/lib/libboost_*.dylib resolvió el problema y me permitió vincularlo estáticamente. El programa en el que estoy trabajando es de redistribución, y quiero distribuir un ejecutable sin dependencias, por lo que otras soluciones en esta página no eran viables. Si eso no es aceptable, también podría especificar la ruta completa a la lib, como -l / usr / include / lib / libboost_log.a, pero eso da como resultado makefiles dependientes del sistema.


Si quieres link boost.log estáticamente, entonces tal vez necesites hacer esto (bibliotecas en este orden)

g++ main.cpp -static -lboost_log -lboost_system -lboost_thread -lpthread -o main


Simplemente significa que la biblioteca boost-log no está vinculada correctamente. Además, el orden en GCC sí importa. Consulte esta question .

  1. Primero asegúrese de que la biblioteca esté construida correctamente y tenga todos los símbolos.
  2. Intenta cambiar el orden. Puede ser que te ayude.

Solo agrega una linea

#define BOOST_LOG_DYN_LINK 1

como la primera línea de boosttest.cc .

De forma alternativa, puede agregar -DBOOST_LOG_DYN_LINK a su paso de compilación (no al paso de enlace, tal como lo publicó en la pregunta):

g++ -std=c++11 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c boosttest.cc g++ boosttest.o -lpthread -lboost_log -o boosttest


Solo necesita agregar la definición BOOST_LOG_DYN_LINK . Por lo tanto, en el comando de una sola línea como tal:

g++ -DBOOST_LOG_DYN_LINK logging_test.cpp -lboost_log -lpthread

Con ese comando, debería estar ejecutándose ahora.


Tuve el mismo problema molesto. La macro debe definirse al compilar, no enlazar:

g++ -std=c++11 -DBOOST_LOG_DYN_LINK -c boosttest.cc

En el comando del enlazador, asegúrese de que el orden sea el siguiente:

g++ boosttest.o -lboost_log -lpthread -o boosttest


en realidad, solo g++ -DBOOST_ALL_DYN_LINK -lpthread -lboost_log-mt logging_test.cpp funciona para mí. DBOOST_LOG_DYN_LINK o -lboost_log obtuvieron el mismo error.


-lboost_log_setup resolvió el problema por mí.

Lo tomé prestado del banco de spdlog Makefile

g++ -std=c++11 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c boost-bench-mt.cpp g++ boost-bench-mt.o -lpthread -lboost_log -lboost_log_setup -lboost_system -lboost_thread -o boost-bench-mt