链接boost日志教程时出现链接器错误(未定义的引用)
linker error while linking boost log tutorial (undefined references)
我已经通过百胜在Fedora 20上安装了boost,并尝试了一些简单的示例。然而,我很难编译日志教程中的第一个示例。
用g++ -c boosttest.cc
编译很好,但当我试图将它与链接时,我会遇到很多错误
g++ boosttest.o -o boosttest -lboost_log -lpthread
完整的错误日志:
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
我错过了什么?我做错了什么?
编辑1:-lboost_log -lpthread
的顺序对输出没有影响。还有一个非常相似的问题,但解决方案对我不起作用。以下也失败了,出现了相同的错误:
g++ -DBOOST_LOG_DYN_LINK boosttest.o -o boosttest -lboost_log -lpthread
只需添加一行
#define BOOST_LOG_DYN_LINK 1
作为CCD_ 3的第一行。
或者,您可以将-DBOOST_LOG_DYN_LINK
添加到编译步骤中(而不是链接步骤,如您在问题中所述):
g++ -std=c++11 -Wall -pedantic -g -O0 -DBOOST_LOG_DYN_LINK -c boosttest.cc
g++ boosttest.o -lpthread -lboost_log -o boosttest
我也有这个错误,如果你使用CMake,你可以通过以下方式解决这个问题,
-
查找相关包:log log_setup
find_package(Boost COMPONENTS program_options log log_setup REQUIRED)
2.将log和log_setup附加到其他库中:
set(PROJECT_LIB ${PROJECT_LIB} ${Boost_LOG_LIBRARY} ${Boost_LOG_SETUP_LIBRARY})
将这些库链接到您的程序中,
target_link_libraries(${PROJECT_NAME} -Wl,--start-group ${PROJECT_LIB} -Wl,--end-group)
将DBOOST_LOG_DYN_LINK添加到CMAKE_CXX_FLAGS标志
set(CMAKE_CXX_FLAGS "-Wall -Wextra -fPIC -fopenmp -DBOOST_LOG_DYN_LINK")
我也遇到了同样令人讨厌的问题。宏应该在编译时定义,而不是链接:
g++ -std=c++11 -DBOOST_LOG_DYN_LINK -c boosttest.cc
在链接器命令中,确保顺序如下:
g++ boosttest.o -lboost_log -lpthread -o boosttest
-lboost_log_setup
为我解决了这个问题。
我从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
看看Mark Lakata在Boost记录器链接问题中的回答
我的问题,可能也是Michael的问题,确实是/usr/local/lib中同时存在.dlib和.a。由于我不打算动态链接boost,所以运行sudo rm -f /usr/local/lib/libboost_*.dylib
解决了这个问题,并让我静态链接。我正在处理的程序是为了重新分发,我想分发一个没有依赖关系的可执行文件,所以这个页面上的其他解决方案是不可行的。如果这是不可接受的,您也可以指定lib的完整路径,如-l/usr/include/lib/libboost_log.a,但这会导致生成依赖于系统的makefile。
我正在使用cmake
,在make
上得到相同的错误,我将set (CMAKE_CXX_FLAGS "-g -Wall -DBOOST_LOG_DYN_LINK")
插入到我的CMakeLists.txt
中,使其看起来像:
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")
它创建了这个输出:
-- 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:
-- /path/to/env/include
-- Configuring done
-- Generating done
请注意,Boost_LIBRARIES
由于某些原因而保持为空…:o
您只需要添加BOOST_LOG_DYN_LINK
定义。所以,在一个这样的线性命令中:
g++ -DBOOST_LOG_DYN_LINK logging_test.cpp -lboost_log -lpthread
有了这个命令,它现在应该正在运行。
实际上,只有g++ -DBOOST_ALL_DYN_LINK -lpthread -lboost_log-mt logging_test.cpp
对我有效。DBOOST_LOG_DYN_LINK
或-lboost_log
也出现了同样的错误。
如果您想要链接boost.log静态,那么您可能需要这样做(按此顺序排列的库)
g++ main.cpp -static -lboost_log -lboost_system -lboost_thread -lpthread -o main
如果只需要静态编译,则可以避免使用标志。在这种情况下,只需在CMake中包含log
和log_setup
组件。
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.67.0 COMPONENTS log log_setup REQUIRED)
if(Boost_FOUND)
target_link_libraries(YourExecutable ${Boost_LIBRARIES})
endif()
在一些main.cpp中给定一些琐碎的日志记录代码,例如:
#include <iostream>
#define BOOST_LOG_DYN_LINK 1 #defined before log headers
#include <boost/log/trivial.hpp>
int main() {
BOOST_LOG_TRIVIAL(debug) << "This is a debug message.";
return 0;
}
您可以使用进行编译
g++main.cpp-lbost_log-lbostrongystem-lbost_thread-lpthread-o main
在包含BOOST/LOG标头之前,请确保#define BOOST_LOG_DYN_LINK。
这只是意味着boost日志库没有正确链接。此外,GCC中的秩序也很重要。请参阅此问题。
- 首先确保库已正确构建,并且具有所有符号
- 试着改变顺序。它可能会对你有所帮助
有人添加了一个添加cflag BOOST_LOG_DYN_LINK的程序。我认为这并不全是事实。
要使用libboost_log,您应该在构建库时了解库的cxxflag。可能没有将标志BOOST_LOG_DYN_LINK添加到构建中。
你应该保管好文件boost/log/detail/config.hpp。
无论如何,您应该与链接的libboost_log保持相同的boost_log_version_namespace。
要检查boost_log_version_namespace,可以使用以下命令:nm-C libboost_log|grep push_record_move
push_record_move是boost_log的一个函数,它会输出,就像这样,boost::log::v2s_mt_posix::core::push_record_move(boost:;log::v2s_mt_posix::record&)
v2s_mt_posix是boost_log_version_namespace。
如果你想静态链接boost日志记录,你需要在boost编译期间使用_WIN32_WINNT和boost_LOG_NO_THREADS设置,并设置你将使用日志记录的项目。
boost\1.67.0\include\boost\log\detail\config.hpp中的以下片段解释了如何选择日志记录的命名空间。
若您不确定boost是如何编译的,请尝试在十六进制编辑器中打开库并找到流提供程序。
std@@@attributes@v2s_mt_nt6@log@1@_N@Z.??0stream_compound@$流_提供者
下面的代码段描述了链接器的要求。
// 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)
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- CURL 静态链接未解析的外部符号
- OCCI 链接:未定义的符号
- CMAKE OS X CLION.如何链接自定义动态库
- C++链接未定义的引用
- 静态库链接 已定义符号的问题"Undefined symbols"
- 如何链接自定义静态库
- 如何设置 CMAKE 静态链接(未定义对 'dlopen' 的引用)?
- MFC 静态链接未解析的外部符号
- Visual Studio C++链接未使用的全局变量
- 如何在静态库中的单独 cpp 文件中链接未引用的变量
- C++链接是否足够聪明,可以避免链接未使用的库
- MinGW 与 MSVC 的 dll 库问题链接(未定义的引用)
- SDL2_mixer链接未定义引用C::B
- g++.exe[警告]链接器输入文件未使用,因为链接未完成
- c++链接自定义.so库,然后与JNI
- 在单独的.cpp文件和生成文件链接中定义的类外部的 C++ 函数
- 将犰狳/布拉斯/拉帕克与 cmake 链接(未定义对"dgemv_"的引用)
- 在 Ubuntu 12.04 上链接 - 未定义对"clock_gettime@GLIBC_2.17"的引用
- 在Makefile中链接时定义变量的问题