使用 cmake 错误链接 boost 日志

2024-01-23

什么可能导致以下问题: 我尝试在 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库:

-- log

- 系统

- 约会时间

-- 日志设置

- 文件系统

- 线

-- 正则表达式

——计时

-- 原子升压版本:106400 升压 INCLUDE_DIRS:/usr/local/include 升压 Boost_LIBRARY_DIRS:/usr/local/lib 升压

图书馆: /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)都存在于此文件夹中。

我缺少什么?


只需尝试添加这一行

#define BOOST_LOG_DYN_LINK 1

作为 main.cpp 文件的第一行,我认为它应该有效,有人遇到了同样的问题here https://stackoverflow.com/questions/23137637/linker-error-while-linking-boost-log-tutorial-undefined-references

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

ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)

到 CMake 文件 您还需要添加 OpenMP 包

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 cmake 错误链接 boost 日志 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐