【问题标题】:boost_log example with sinks fails to compile带有接收器的 boost_log 示例无法编译
【发布时间】:2014-10-03 13:46:52
【问题描述】:

我正在考虑将 boost_log 用于一个项目,但一开始我遇到了以下问题。

我在http://www.boost.org/doc/libs/1_54_0/libs/log/example/doc/tutorial_file.cpp 找到的 Boost 日志示例无法编译。其他更简单的示例(没有接收器)我编译没有问题。

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

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

【问题讨论】:

    标签: c++ linux boost g++ boost-log


    【解决方案1】:

    您必须手动链接 boost_thread:

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

    【讨论】:

    • 嗨,Zitsen,我仍然遇到不同的错误,但是当我添加了两个额外的库时,它就起作用了。谢谢。以下行对我有用: g++ -std=c++11 boost_log_sinks.cpp -DBOOST_LOG_DYN_LINK -lboost_log -lboost_thread -lpthread -lboost_system -lboost_log_setup
    【解决方案2】:

    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
    

    【讨论】:

    • 在我将 -lboost_log_setup 和 -lboost_thread 添加到链接器后它工作了。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多