将boost日志链接到库的问题



我创建了一个静态库(在linux机器上),它的构建没有错误,但是当我与其他项目链接时,结果出现了许多错误。由cmake链接。当我将这个库构建为可执行文件时,它是工作的。

CMakeLists.txt - where build library

cmake_minimum_required(VERSION 3.0)
project(log_lib LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
set(Boost_USE_STATIC_LIBS ON)
add_library(log_lib STATIC
log_lib_global.h
log_lib.cpp
log_lib.h
)
find_package(Boost COMPONENTS system thread log log_setup REQUIRED)
find_package(Threads REQUIRED)
target_link_libraries(log_lib 
Boost::system
Boost::thread
Boost::log
Boost::log_setup
)
target_link_libraries(log_lib Threads::Threads)
target_link_libraries(log_lib -ldl)#for UNIX
INSTALL(
TARGETS log_lib
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
COMPONENT library
)
target_compile_definitions(log_lib LOG_LIB_LIBRARY)

CMakeLists.txt - cmake where链接库到可执行文件

cmake_minimum_required (VERSION 3.0)
project (test_log_lib)
include_directories(../log_lib/)

add_executable (test_log_lib main.cpp)
target_link_libraries (test_log_lib /home/valdemar/prog/log_lib/build/liblog_lib.a)

和result cmake(不是全部)

[main] Building folder: test_log_lib test_log_lib
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /home/valdemar/prog/test_log_lib/build --config Debug --target test_log_lib -j 6 --
[build] [ 50%] Linking CXX executable test_log_lib
[build] /usr/bin/ld: CMakeFiles/test_log_lib.dir/main.cpp.o: в функции «boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger<logger::severity_level>, boost::log::v2s_mt_posix::sources::single_thread_model>::~basic_logger()»:
[build] /usr/include/boost/log/sources/basic_logger.hpp:79: неопределённая ссылка на «boost::log::v2s_mt_posix::attribute_set::~attribute_set()»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «logger::Log_lib::log_init()»:
[build] /home/valdemar/prog/log_lib/log_lib.cpp:60: неопределённая ссылка на «boost::log::v2s_mt_posix::sinks::basic_text_ostream_backend<char>::add_stream(boost::shared_ptr<std::ostream> const&)»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:62: неопределённая ссылка на «boost::log::v2s_mt_posix::sinks::basic_text_ostream_backend<char>::add_stream(boost::shared_ptr<std::ostream> const&)»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:64: неопределённая ссылка на «boost::log::v2s_mt_posix::sinks::basic_text_ostream_backend<char>::add_stream(boost::shared_ptr<std::ostream> const&)»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:86: неопределённая ссылка на «boost::log::v2s_mt_posix::core::get()»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:86: неопределённая ссылка на «boost::log::v2s_mt_posix::core::add_sink(boost::shared_ptr<boost::log::v2s_mt_posix::sinks::sink> const&)»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:87: неопределённая с��ылка на «boost::log::v2s_mt_posix::core::get()»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:87: неопределённая ссылка на «boost::log::v2s_mt_posix::core::add_sink(boost::shared_ptr<boost::log::v2s_mt_posix::sinks::sink> const&)»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:88: неопределённая ссылка на «boost::log::v2s_mt_posix::core::get()»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/log_lib.cpp:88: неопределённая ссылка на «boost::log::v2s_mt_posix::core::add_sink(boost::shared_ptr<boost::log::v2s_mt_posix::sinks::sink> const&)»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «boost::log::v2s_mt_posix::aux::light_rw_mutex::light_rw_mutex()»:
[build] /usr/include/boost/log/detail/light_rw_mutex.hpp:103: неопределённая ссылка на «pthread_rwlock_init»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «boost::log::v2s_mt_posix::aux::light_rw_mutex::~light_rw_mutex()»:
[build] /usr/include/boost/log/detail/light_rw_mutex.hpp:107: неопределённая ссылка на «pthread_rwlock_destroy»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «boost::log::v2s_mt_posix::aux::light_rw_mutex::lock_shared()»:
[build] /usr/include/boost/log/detail/light_rw_mutex.hpp:111: неопределённая ссылка на «pthread_rwlock_rdlock»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «boost::log::v2s_mt_posix::aux::light_rw_mutex::unlock_shared()»:
[build] /usr/include/boost/log/detail/light_rw_mutex.hpp:115: неопределённая ссылка на «pthread_rwlock_unlock»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «boost::log::v2s_mt_posix::aux::light_rw_mutex::lock()»:
[build] /usr/include/boost/log/detail/light_rw_mutex.hpp:119: неопределённая ссылка на «pthread_rwlock_wrlock»
[build] /usr/bin/ld: /home/valdemar/prog/log_lib/build/liblog_lib.a(log_lib.cpp.o): в функции «boost::log::v2s_mt_posix::aux::light_rw_mutex::unlock()»:
[build] /usr/include/boost/log/detail/light_rw_mutex.hpp:123: неопределённая ссылка на «pthread_rwlock_unlock»

您的CMakeLists.txt中有多个问题,这相当于您的可执行文件没有与Boost.Log链接。

首先,你不应该在target_link_libraries中指定带有路径或编译器选项的完整库文件名。例如,不用

target_link_libraries (test_log_lib /home/valdemar/prog/log_lib/build/liblog_lib.a)

你应该写

target_link_libraries (test_log_lib log_lib)

注意,如果log_libtest_log_lib是同一个CMake项目树的一部分,那么CMake将能够拉log_lib的依赖关系链接test_log_lib。这是可能的,因为在这种情况下,log_lib将被解释为CMake目标而不是外部静态库。如果可执行文件和库是分开的,那么你必须显式地为test_log_lib指定log_lib的所有依赖项(因为在Linux上静态库本身不携带有关其依赖项的信息)。

最新更新