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

时间:2014-08-10 17:36:56

标签: c++ linux c++11 boost g++

我正在考虑将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.o:未定义的符号引用   ' _ZN5boost6detail12get_tss_dataEPKv'   //usr/lib/x86_64-linux-gnu/libboost_thread.so.1.54.0:添加错误   符号:命令行collect2中缺少DSO:错误:ld返回1   退出状态

我正在研究Ubuntu14.04我的g ++版本是g ++(Ubuntu 4.8.2-19ubuntu1)4.8.2

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

3 个答案:

答案 0 :(得分:7)

你必须链接boost_thread manualy:

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

答案 1 :(得分:2)

boost_log库使用其他boost库中的功能。遗憾的是,文档未能指出哪些是这些库。因此,无论何时使用这些功能之一,您都需要链接到该功能所在的相应库,或者您收到错误消息:

  

未定义的符号引用

我使用的解决方案是循环所有提升库以搜索该符号(在您的情况下为_ZN5boost6detail12get_tss_dataEPKv。)

在Ubuntu 17.04中,升级库存储在/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中。因此,您现在要做的就是在链接命令中包含该lib:

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

答案 2 :(得分:0)

要编译示例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