【发布时间】:2014-12-16 11:52:19
【问题描述】:
我的环境:solaris 5.10 gcc 4.8.2 boost 1.54
代码:
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
int main() {
BOOST_LOG_TRIVIAL(fatal) << "init " << filename << std::endl;
return 0;
}
编译选项和问题:
-bash-3.2$ g++ x.cc -lboost_log -lsocket -lnsl -o x
Undefined first referenced
symbol in file
boost::log::v2s_st::aux::stream_provider<char>::allocate_compound(boost::log::v2s_st::record&) /var/tmp//ccPKqK2f.o
boost::log::v2s_st::aux::unhandled_exception_count() /var/tmp//ccPKqK2f.o
boost::log::v2s_st::record_view::public_data::destroy(boost::log::v2s_st::record_view::public_data const*) /var/tmp//ccPKqK2f.o
boost::log::v2s_st::core::open_record(boost::log::v2s_st::attribute_set const&) /var/tmp//ccPKqK2f.o
boost::log::v2s_st::trivial::logger::get() /var/tmp//ccPKqK2f.o
boost::log::v2s_st::core::get_logging_enabled() const /var/tmp//ccPKqK2f.o
boost::log::v2s_st::core::push_record_move(boost::log::v2s_st::record&) /var/tmp//ccPKqK2f.o
boost::log::v2s_st::aux::stream_provider<char>::release_compound(boost::log::v2s_st::aux::stream_provider<char>::stream_compound*) /var/tmp//ccPKqK2f.o
boost::log::v2s_st::sources::aux::get_severity_level() /var/tmp//ccPKqK2f.o
ld: fatal: symbol referencing errors. No output written to x
collect2: error: ld returned 1 exit status
但是
-bash-3.2$ nm -A /usr/local/lib/libboost_log.so | grep unhandled_exception_count
/usr/local/lib/libboost_log.so: [2277] | 735336| 24|FUNC |GLOB |0 |10 |_ZN5boost3log11v2_mt_posix3aux25unhandled_exception_countEv
我们可以看到有boost::log::v2s_**mt**::aux::unhandled_exception_count, but hasn't boost::log::v2s_st::aux::unhandled_exception_count。
我的问题是编译器如何选择在这种情况下使用哪一个?
我已阅读http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/installation/config.html。 但仍然不知道 “无线程支持” 是什么意思。 trid 用 -lpthread 编译,但得到同样的错误。
更新
-bash-3.2$ g++ x.cc -lsocket -lnsl -o x -pthread -lboost_log
Undefined first referenced
symbol in file
boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&) /var/tmp//ccZHBWis.o
icu::Collator::createInstance(icu::Locale const&, UErrorCode&) /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&) /var/tmp//ccZHBWis.o
boost::log::v2s_mt_posix::core::get_logging_enabled() const /var/tmp//ccZHBWis.o
boost::log::v2s_mt_posix::aux::unhandled_exception_count() /var/tmp//ccZHBWis.o
icu::Locale::Locale(icu::Locale const&) /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*) /var/tmp//ccZHBWis.o
boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&) /var/tmp//ccZHBWis.o
icu::Locale::Locale() /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
icu::Locale::~Locale() /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*) /var/tmp//ccZHBWis.o
boost::log::v2s_mt_posix::sources::aux::get_severity_level() /var/tmp//ccZHBWis.o
boost::log::v2s_mt_posix::trivial::logger::get() /var/tmp//ccZHBWis.o
ld: fatal: symbol referencing errors. No output written to x
collect2: error: ld returned 1 exit status
带有 pthread 标志,它开始使用“mt”,但它要求 v2s_mt_posix。但是我们的库提供了 v2s_mt_posix3
解决方法
-bash-3.2$ g++ x.cc -lsocket -lnsl -o x -pthread /usr/local/lib/libboost_log.a /usr/local/lib/libboost_log_setup.a /usr/local/lib/libboost_thread.a /usr/local/lib/libboost_system.a -lrt
-bash-3.2$ ./x
[2014-12-17 02:15:55.082758] [0x10000000] [fatal] init
使用动态链接还是不行,原因不明
-bash-3.2$ g++ x.cc -lsocket -lnsl -o x -pthread -lboost_log -lboost_log_setup -lboost_thread -lboost_system -lrt
Undefined first referenced
symbol in file
boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&) /var/tmp//ccegh2wS.o
icu::Collator::createInstance(icu::Locale const&, UErrorCode&) /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&) /var/tmp//ccegh2wS.o
boost::log::v2s_mt_posix::core::get_logging_enabled() const /var/tmp//ccegh2wS.o
boost::log::v2s_mt_posix::aux::unhandled_exception_count() /var/tmp//ccegh2wS.o
icu::Locale::Locale(icu::Locale const&) /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*) /var/tmp//ccegh2wS.o
boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&) /var/tmp//ccegh2wS.o
icu::Locale::Locale() /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
icu::Locale::~Locale() /usr/local/lib/gcc/sparc64-sun-solaris2.10/4.8.2/../../../libboost_regex.so.1.57.0
boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*) /var/tmp//ccegh2wS.o
boost::log::v2s_mt_posix::sources::aux::get_severity_level() /var/tmp//ccegh2wS.o
boost::log::v2s_mt_posix::trivial::logger::get() /var/tmp//ccegh2wS.o
ld: fatal: symbol referencing errors. No output written to x
collect2: error: ld returned 1 exit status
【问题讨论】:
-
您可能还需要链接到
boostlog_setup。 -
谢谢@JoachimPileborg,还是不行:(
-
还可以尝试在生成的库上使用
nm -A libboost_* | grep mt_posix并检查符号以查看它们是否存在。根据 mt、st 或 v2s 或 v2,您应该能够推断出以兼容方式构建所需的标志。