【问题标题】:The problem with linking the boost log to the library将 boost 日志链接到库的问题
【发布时间】:2021-10-19 03:17:11
【问题描述】:

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

CMakeLists.txt - 构建库的位置

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 将库链接到可执行文件

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)

和结果 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»

【问题讨论】:

标签: c++ boost cmake boost-log


【解决方案1】:

您的 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 静态库上,它们本身不携带有关其依赖项的信息)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多