【问题标题】:linking boost log using cmake error使用cmake错误链接boost日志
【发布时间】:2019-01-01 23:07:18
【问题描述】:

什么会导致以下问题: 我尝试在 cmake 项目中使用 boost::log 。

我的 CMakeList.txt 文件如下所示:

cmake_minimum_required(VERSION 3.10)
project(boostLogTest)
set(CMAKE_CXX_STANDARD 11)
add_executable(boostLogTest main.cpp)
ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) #####  edit after DiCri's answer #####
find_package(Boost REQUIRED COMPONENTS log system)

if (Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})

    message("Boost VERSION: ${Boost_VERSION}")
    message("Boost INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
    message("Boost Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")
    message("Boost LIBRARIES: ${Boost_LIBRARIES}")

    TARGET_LINK_LIBRARIES(boostLogTest ${Boost_LIBRARIES})
endif ()

我的 main.cpp 文件如下所示:

#include <iostream>

#include <boost/log/trivial.hpp>

int main(int, char*[])
{
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    return 0;
}

我的 CMake 输出如下

-- 增强版本:1.64.0

-- 找到以下 Boost 库:

--日志

--系统

-- 日期时间

-- 日志设置

-- 文件系统

--线程

-- 正则表达式

-- 计时

-- atomic Boost VERSION: 106400 Boost INCLUDE_DIRS: /usr/local/include Boost Boost_LIBRARY_DIRS: /usr/local/lib Boost

图书馆: /usr/local/lib/libboost_log.so;/usr/local/lib/libboost_system.so;/usr/local/lib/libboost_date_time.so;/usr/local/lib/libboost_log_setup.so;/usr/local/lib /libboost_filesystem.so;/usr/local/lib/libboost_thread.so;/usr/local/lib/libboost_regex.so;/usr/local/lib/libboost_chrono.so;/usr/local/lib/libboost_atomic.so

-- 配置完成

-- 生成完成

-- 构建文件已写入:/home/.../CLionProjects/boostLogTest/cmake-build-debug

但在链接时我收到以下错误消息:

[50%] 链接 CXX 可执行文件 boostLogTest

CMakeFiles/boostLogTest.dir/main.cpp.o:在函数'main'中:

/home/.../CLionProjects/boostLogTest/main.cpp:7:未定义对`boost::log::v2s_mt_posix::trivial::logger::get()'的引用

/home/.../CLionProjects/boostLogTest/main.cpp:7:未定义对`boost::log::v2s_mt_posix::trivial::logger::get()'的引用

/home/.../CLionProjects/boostLogTest/main.cpp:8:未定义对`boost::log::v2s_mt_posix::trivial::logger::get()'的引用

/home/.../CLionProjects/boostLogTest/main.cpp:8:未定义对`boost::log::v2s_mt_posix::trivial::logger::get()'的引用

/home/.../CLionProjects/boostLogTest/main.cpp:9: 未定义引用boost::log::v2s_mt_posix::trivial::logger::get()' CMakeFiles/boostLogTest.dir/main.cpp.o:/home/.../CLionProjects/boostLogTest/main.cpp:9: more undefined references toboost::log::v2s_mt_posix::trivial::logger::get()' 跟随...

在 DiCri 回答后编辑: 现在我收到以下错误消息:

[50%] 链接 CXX 可执行文件 boostLogTest

/usr/bin/ld: CMakeFiles/boostLogTest.dir/main.cpp.o: 对符号'pthread_rwlock_unlock@@GLIBC_2.2.5'的未定义引用

//lib/x86_64-linux-gnu/libpthread.so.0:添加符号时出错:命令行中缺少 DSO

collect2: 错误:ld 返回 1 个退出状态

CMakeFiles/boostLogTest.dir/build.make:103:目标“boostLogTest”的配方失败

make[3]: *** [boostLogTest] 错误 1

CMakeFiles/Makefile2:67:目标“CMakeFiles/boostLogTest.dir/all”的配方失败

make[2]: *** [CMakeFiles/boostLogTest.dir/all] 错误2

CMakeFiles/Makefile2:79:目标“CMakeFiles/boostLogTest.dir/rule”的配方失败

make[1]: *** [CMakeFiles/boostLogTest.dir/rule] 错误2

Makefile:118: 目标“boostLogTest”的配方失败

make: *** [boostLogTest] 错误 2

如果我添加

set(Boost_USE_STATIC_LIBS        ON) 

库的路径更改为 *.a 文件,例如:

Boost LIBRARIES: /usr/local/lib/libboost_log.a;/usr/local/lib/libboost_system.a;...

所有列出的库(*.so 和 *.a)都存在于此文件夹中。

我错过了什么?

【问题讨论】:

    标签: c++ logging boost cmake


    【解决方案1】:

    尝试添加这一行

    #define BOOST_LOG_DYN_LINK 1
    

    作为 main.cpp 文件的第一行,我认为它应该可以工作,有人遇到了同样的问题here

    如果这不起作用,请尝试添加此行

    ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)
    

    到 CMake 文件 你也需要添加 OpenMP 包

    【讨论】:

    • 谢谢。我现在得到: [ 50%] Linking CXX executable boostLogTest /usr/bin/ld: CMakeFiles/boostLogTest.dir/main.cpp.o: undefined reference to symbol 'pthread_rwlock_unlock@@GLIBC_2.2.5' //lib/x86_64-linux -gnu/libpthread.so.0:添加符号时出错:命令行 collect2 中缺少 DSO:错误:ld 返回 1 个退出状态 CMakeFiles/boostLogTest.dir/build.make:103:目标“boostLogTest”的配方失败
    • 有没有办法在 cmake 中设置这个?
    • 感谢您的提示。现在它正在工作。我只是添加了 OpenMP 包(我在实际应用程序中也需要它,但在 boost::log 测试中没有使用它),现在一切正常。总之,ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) 和使用 OpenMP 的组合有效
    • 我更新了谁会遇到同样问题的答案,所以接受答案并签署主题已解决@user7431005
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多