it-swarm.com.de

linker-Fehler beim Verknüpfen des Boog-Log-Tutorials

Ich habe auf Fedora 20 Boost über yum installiert und versuche einige einfache Beispiele. Ich habe jedoch Schwierigkeiten, das erste Beispiel aus dem Logging-Tutorial zu kompilieren.

Das Kompilieren mit g++ -c boosttest.cc funktioniert gut, aber ich bekomme viele Fehler, wenn ich versuche, es mit zu verknüpfen

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

das vollständige Fehlerprotokoll:

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

Was vermisse ich? Was mache ich falsch?

EDIT 1: Die Reihenfolge von -lboost_log -lpthread macht in der Ausgabe keinen Unterschied. Es gibt auch eine sehr ähnliche Frage , aber die Lösung funktioniert für mich nicht. Folgendes schlägt ebenfalls mit den gleichen Fehlern fehl:

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

Fügen Sie einfach eine Zeile hinzu

#define BOOST_LOG_DYN_LINK 1

als erste Zeile von boosttest.cc.

Alternativ können Sie -DBOOST_LOG_DYN_LINK zu Ihrem Kompilierungsschritt hinzufügen (nicht dem Verknüpfungsschritt, wie Sie in der Frage gepostet haben)

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

Ich hatte das gleiche nervige Problem ..__ Das Makro sollte beim Kompilieren definiert werden, nicht verknüpfen:

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

Stellen Sie im Linkerbefehl sicher, dass die Reihenfolge wie folgt lautet:

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

-lboost_log_setup hat das Problem für mich gelöst.

Ich habe es von spdlog bench Makefile geliehen

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

Ich verwende cmake und erhalte die gleiche Fehlermeldung in make. Ich habe set (CMAKE_CXX_FLAGS "-g -Wall -DBOOST_LOG_DYN_LINK") in meinen CMakeLists.txt eingefügt, damit es so aussieht:

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")

was diese Ausgabe erzeugt:

-- 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

Beachten Sie, dass Boost_LIBRARIES aus irgendeinem Grund leer bleibt ...: o

2
cerr

Sehen Sie sich die Antwort von Mark Lakata in Boost-Logger-Linking-Problem an.

Mein Problem und wahrscheinlich Michaels Problem ist in der Tat die Anwesenheit von .dylib und .a in/usr/local/lib. Da ich nicht vorhabe, Boost dynamisch zu verknüpfen, löste Sudo rm -f /usr/local/lib/libboost_*.dylib das Problem und ließ mich statisch verknüpfen. Das Programm, an dem ich arbeite, ist für die Umverteilung gedacht, und ich möchte eine ausführbare Datei ohne Abhängigkeiten verteilen, sodass andere Lösungen auf dieser Seite nicht funktionsfähig sind .. Wenn dies nicht akzeptabel ist, können Sie auch den vollständigen Pfad zur lib angeben. Wie -l/usr/include/lib/libboost_log.a, aber dies führt zu systemabhängigen Makefiles.

2
Tony BenBrahim

Sie müssen nur die BOOST_LOG_DYN_LINK-Definition hinzufügen. Also, in einem Einzeiler-Befehl wie folgt:

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

Mit diesem Befehl sollte es jetzt laufen.

1
silgon

Wenn Sie den Link boost.log statically möchten, müssen Sie dies (Bibliotheken in dieser Reihenfolge) tun.

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

Jemand möchte das cflag BOOST_LOG_DYN_LINK hinzufügen. Ich denke es ist nicht die ganze Wahrheit.

Um libboost_log verwenden zu können, sollten Sie das cxxflag der Bibliothek beim Erstellen kennen. Möglicherweise wird das Flag BOOST_LOG_DYN_LINK nicht zum Build hinzugefügt.

Sie sollten sich um die Datei Boost/log/detail/config.hpp über den BOOST_LOG_VERSION_NAMESPACE kümmern.

Trotzdem sollten Sie den gleichen boost_log_version_namespace mit dem verknüpften libboost_log beibehalten.

Zur Überprüfung des boost_log_version_namespace kann der Befehl verwendet werden: Nm -C libboost_log | grep Push_record_move

Push_record_move ist eine Funktion von boost_log. Es gibt folgende Ausgabe aus Boost :: log :: v2s_mt_posix :: core :: Push_record_move (boost :: log :: v2s_mt_posix :: record &)

v2s_mt_posix ist der boost_log_version_namespace.

1
Loach Fish

Wenn Sie die Boost-Protokollierung statisch verknüpfen möchten, müssen Sie die Einstellungen _WIN32_WINNT und BOOST_LOG_NO_THREADS während der Boost-Kompilierung und der Projekteinstellung mit der Protokollierung verwenden.

Der folgende Ausschnitt in boost\1.67.0\include\boost\log\detail\config.hpp erklärt, wie der Namespace für die Protokollierung ausgewählt wurde.

Wenn Sie nicht sicher sind, wie der Boost kompiliert wurde, öffnen Sie die Bibliothek im Hex-Editor und suchen Sie den Stream-Provider.

std @@@ attributes @ v2s_mt_nt6 @ log @ 1 @ _N @ Z. ?? 0stream_compound @? $ stream_provider

Snippet unten beschreibt, was der Linker verlangt.

// 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

Dies bedeutet einfach, dass die Boost-Log-Bibliothek nicht ordnungsgemäß verknüpft ist. Auch die Reihenfolge im GCC spielt eine Rolle. Siehe diese Frage .

  1. Stellen Sie zunächst sicher, dass die Bibliothek ordnungsgemäß erstellt wurde und alle Symbole vorhanden sind.
  2. Versuchen Sie die Reihenfolge zu ändern. Es könnte dir helfen.
0
doptimusprime

eigentlich funktioniert nur g++ -DBOOST_ALL_DYN_LINK -lpthread -lboost_log-mt logging_test.cpp für mich. DBOOST_LOG_DYN_LINK oder -lboost_log haben den gleichen Fehler erhalten.

0
speedcell4

Ich hatte auch diesen Fehler, wenn Sie CMake verwenden, können Sie dieses Problem möglicherweise auf folgende Weise beheben:

  1. Ähnliche Pakete suchen: log log_setup

    find_package(Boost COMPONENTS program_options log log_setup REQUIRED)

2. Hängen Sie log und log_setup in andere Bibliotheken ein:

  set(PROJECT_LIB ${PROJECT_LIB} ${Boost_LOG_LIBRARY} ${Boost_LOG_SETUP_LIBRARY})
  1. Binden Sie diese Bibliotheken in Ihr Programm ein,

    target_link_libraries(${PROJECT_NAME} -Wl,--start-group ${PROJECT_LIB} -Wl,--end-group)

  2. Fügen Sie DBOOST_LOG_DYN_LINK zu CMAKE_CXX_FLAGS Flags hinzu

    set(CMAKE_CXX_FLAGS "-Wall -Wextra -fPIC -fopenmp -DBOOST_LOG_DYN_LINK")

0
GPrathap