带有接收器的Boost_log示例无法编译

boost_log example with sinks fails to compile

本文关键字:编译 log 接收器 Boost      更新时间:2023-10-16

我考虑在一个项目中使用boost_log,一开始我就面临以下问题:

Boost日志示例:http://www.boost.org/doc/libs/1_54_0/libs/log/example/doc/tutorial_file.cpp编译失败。其他更简单的例子(没有水槽)我编译没有问题。

g++ -std=c++11 boost_log_sinks.cpp -DBOOST_LOG_DYN_LINK -lboost_log -lpthread

/usr/bin/ld:/tmp/ccApJdsi。0:对符号的未定义引用"_ZN5boost6detail12get_tss_dataEPKv"//usr/lib/x86_64-linux-gnu/libboost_thread.so.1.54.0:添加错误符号:DSO从命令行丢失collect2:错误:ld返回1退出状态

我正在使用Ubuntu14.04,我的g++版本是g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

有人知道为什么会这样吗?

必须手动链接boost_thread:

g++ -std=c++11 boost_log_sinks.cpp -DBOOST_LOG_DYN_LINK -lboost_log -lboost_thread -lpthread

boost_log库使用来自其他boost库的特性。不幸的是,文档没有指明哪些是这些库。所以当你使用这些功能时,你需要链接到相应的库,否则你会得到错误信息:

对符号

的未定义引用

我使用的解决方案是循环所有boost库来搜索该符号(在您的情况下是_ZN5boost6detail12get_tss_dataEPKv)

在Ubuntu 17.04中,boost库存储在/usr/lib/x86_64-linux-gnu/libboost_*

所以用下面的脚本:

for i in /usr/lib/x86_64-linux-gnu/libboost_*
do
   echo $i
   nm $i|grep _ZN5boost6detail12get_tss_dataEPKv
done

你会得到一个库的列表,其中的符号要么被使用(U),例如:

/usr/lib/x86_64-linux-gnu/libboost_log.a
                 U _ZN5boost6detail12get_tss_dataEPKv
                 U _ZN5boost6detail12get_tss_dataEPKv
                 U _ZN5boost6detail12get_tss_dataEPKv
/usr/lib/x86_64-linux-gnu/libboost_log_setup.a
                 U _ZN5boost6detail12get_tss_dataEPKv

或定义(T),例如:

/usr/lib/x86_64-linux-gnu/libboost_thread.a
0000000000000740 T _ZN5boost6detail12get_tss_dataEPKv

这最后一个是你需要的。它告诉你正在寻找的符号在库libboost_thread.a中。所以你现在要做的就是把这个库包含在你的链接命令中:

g++ -std=c++11 boost_log_sinks.cpp -DBOOST_LOG_DYN_LINK -lboost_log -lboost_thread -lpthread

为了编译示例https://www.boost.org/doc/libs/1_71_0/libs/log/example/doc/tutorial_file.cpp,我必须在Ubuntu中使用所有这些库的编译:

$ c++ -DBOOST_LOG_DYN_LINK tutorial_file.cpp 
-lboost_log_setup -lboost_log -lboost_thread -lpthread -lboost_system