10

我正在考虑将 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: 添加符号时出错:命令行中缺少 DSO collect2:错误:ld 返回 1 个退出状态

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

有谁知道为什么会这样?

4

3 回答 3

8

您必须手动链接 boost_thread:

g++ -std=c++11 boost_log_sinks.cpp -DBOOST_LOG_DYN_LINK -lboost_log -lboost_thread -lpthread
于 2014-09-10T02:59:30.113 回答
3

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
于 2017-07-06T09:35:21.223 回答
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
于 2019-12-09T11:55:20.967 回答