web-dev-qa-db-fra.com

erreur de l'éditeur de liens lors de la liaison au didacticiel de renforcement du journal (références non définies)

J'ai installé boost sur Fedora 20 via yum et j'essaie quelques exemples simples. Cependant, j'ai du mal à compiler le premier exemple tiré du didacticiel de journalisation .

Compiler avec g++ -c boosttest.cc fonctionne bien, mais je reçois beaucoup d’erreurs lorsque je tente de le relier

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

le journal des erreurs complet:

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'est-ce que je rate? Qu'est-ce que je fais mal?

EDIT 1: L'ordre de -lboost_log -lpthread ne fait aucune différence dans la sortie. Il y a aussi une question très similaire }, mais la solution ne fonctionne pas pour moi. Les éléments suivants échouent également avec les mêmes erreurs:

g++ -DBOOST_LOG_DYN_LINK boosttest.o -o boosttest -lboost_log -lpthread
47
Michael Große

Il suffit d'ajouter une ligne

#define BOOST_LOG_DYN_LINK 1

en tant que première ligne de boosttest.cc.

Sinon, vous pouvez ajouter -DBOOST_LOG_DYN_LINK à votre étape de compilation (et non à l'étape de création de liens, comme vous l'avez posté dans la question):

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

J'ai eu le même problème agaçant . La macro doit être définie lors de la compilation, pas de liaison:

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

Dans la commande de l'éditeur de liens, assurez-vous que l'ordre est le suivant:

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

-lboost_log_setup a résolu le problème pour moi.

Je l'ai emprunté à spdlog bench 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
3
palik

J'utilise cmake et j'obtiens la même erreur sur make. J'ai inséré set (CMAKE_CXX_FLAGS "-g -Wall -DBOOST_LOG_DYN_LINK") dans mon CMakeLists.txt pour lui donner l'aspect suivant:

cmake_minimum_required(VERSION 2.6)
project(LOGGER)

set(BOOST_INCLUDEDIR "/path/to/env/include")
set(BOOST_ROOT "/path/to/env/include")

find_package(Boost REQUIRED)

message(STATUS Boost_LIBRARIES:)
message (STATUS ${Boost_LIBRARIES})
message(STATUS BOOST_INCLUDEDIR:)
message(STATUS ${BOOST_INCLUDEDIR})

ADD_EXECUTABLE(logger logger.cpp)
target_include_directories(logger PUBLIC ${BOOST_INCLUDEDIR})

set (CMAKE_CXX_FLAGS "-g -Wall -DBOOST_LOG_DYN_LINK")

ce qui crée cette sortie:

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.67.0
-- Boost_LIBRARIES:
-- 
-- BOOST_INCLUDEDIR:
-- /work/cloudparc/env/include
-- Configuring done
-- Generating done

Remarquez que Boost_LIBRARIES reste vide pour une raison quelconque ...: o

2
cerr

Regardez la réponse de Mark Lakata dans Problème de liaison de l'enregistreur Boost

Mon problème, et probablement celui de Michael, est bien la présence de .dylib et .a dans/usr/local/lib. Étant donné que je ne prévois jamais de relier dynamiquement les liens, l'exécution de Sudo rm -f /usr/local/lib/libboost_*.dylib a résolu le problème et me permet d'effectuer un lien statique. Le programme sur lequel je travaille est destiné à la redistribution, et je souhaite distribuer un exécutable sans dépendances, de sorte que les autres solutions de cette page ne fonctionnent pas . Si cela n’est pas acceptable, vous pouvez également spécifier le chemin complet vers la bibliothèque, comme -l/usr/include/lib/libboost_log.a, mais cela entraîne des makefiles dépendants du système.

2
Tony BenBrahim

Vous devez juste ajouter la définition BOOST_LOG_DYN_LINK. Donc, dans une commande à une ligne comme ceci:

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

Avec cette commande, il devrait être lancé maintenant.

1
silgon

Si vous voulez lier boost.log statiquement alors vous devez peut-être faire ceci (bibliothèques dans cet ordre)

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

Quelqu'un a ajouté le cflag BOOST_LOG_DYN_LINK. Je pense que ce n'est pas toute la vérité.

Pour utiliser libboost_log, vous devez connaître le cxxflag de la bibliothèque lors de sa construction. Peut-être que le drapeau BOOST_LOG_DYN_LINK n'est pas ajouté à la construction.

Vous devez vous occuper du fichier Boost/log/detail/config.hpp du fichier BOOST_LOG_VERSION_NAMESPACE.

Quoi qu'il en soit, vous devez conserver le même boost_log_version_namespace avec le libboost_log qui est lié.

Pour vérifier le boost_log_version_namespace, utilisez la commande suivante: Nm -C libboost_log | grep Push_record_move

Push_record_move est une fonction de boost_log, elle affichera, comme ceci, Boost :: log :: v2s_mt_posix :: core :: Push_record_move (boost :: log :: v2s_mt_posix :: record &)

v2s_mt_posix est l’espace boost_log_version_names.

1
Loach Fish

Si vous voulez lier la consignation optimisée de manière statique, vous devez être précis avec les paramètres _WIN32_WINNT et BOOST_LOG_NO_THREADS lors de la compilation et de la configuration optimisées du projet.

L'extrait suivant dans boost\1.67.0\include\boost\log\detail\config.hpp explique comment l'espace de noms pour la journalisation a été choisi.

Si vous ne savez pas comment boost a été compilé, essayez d'ouvrir la bibliothèque dans l'éditeur hexadécimal et de trouver le fournisseur de flux.

std @@@ attributs @ v2s_mt_nt6 @ log @ 1 @ _N @ Z. ??

Le fragment ci-dessous décrit montre ce que l’éditeur de liens demande.

// Setup namespace name
#if !defined(BOOST_LOG_DOXYGEN_PASS)
#   if defined(BOOST_LOG_DLL)
#       if defined(BOOST_LOG_NO_THREADS)
#           define BOOST_LOG_VERSION_NAMESPACE v2_st
#       else
#           if defined(BOOST_THREAD_PLATFORM_PTHREAD)
#               define BOOST_LOG_VERSION_NAMESPACE v2_mt_posix
#           Elif defined(BOOST_THREAD_PLATFORM_WIN32)
#               if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
#                   define BOOST_LOG_VERSION_NAMESPACE v2_mt_nt6
#               else
#                   define BOOST_LOG_VERSION_NAMESPACE v2_mt_nt5
#               endif
#           else
#               define BOOST_LOG_VERSION_NAMESPACE v2_mt
#           endif
#       endif // defined(BOOST_LOG_NO_THREADS)
#   else
#       if defined(BOOST_LOG_NO_THREADS)
#           define BOOST_LOG_VERSION_NAMESPACE v2s_st
#       else
#           if defined(BOOST_THREAD_PLATFORM_PTHREAD)
#               define BOOST_LOG_VERSION_NAMESPACE v2s_mt_posix
#           Elif defined(BOOST_THREAD_PLATFORM_WIN32)
#               if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
#                   define BOOST_LOG_VERSION_NAMESPACE v2s_mt_nt6
#               else
#                   define BOOST_LOG_VERSION_NAMESPACE v2s_mt_nt5
#               endif
#           else
#               define BOOST_LOG_VERSION_NAMESPACE v2s_mt
#           endif
#       endif // defined(BOOST_LOG_NO_THREADS)
#   endif // defined(BOOST_LOG_DLL)
0
antoxar

Cela signifie simplement que la bibliothèque boost-log n'est pas liée correctement. En outre, l'ordre dans GCC est important. Reportez-vous à cette question .

  1. Tout d'abord, assurez-vous que la bibliothèque est correctement construite et qu'elle contient tous les symboles.
  2. Essayez de changer l'ordre. Cela pourrait vous aider.
0
doptimusprime

en fait, seul g++ -DBOOST_ALL_DYN_LINK -lpthread -lboost_log-mt logging_test.cpp fonctionne pour moi. DBOOST_LOG_DYN_LINK ou -lboost_log a eu la même erreur.

0
speedcell4