【问题标题】:Boost.Log failing to link with static libraries because of missing code_convert由于缺少 code_convert,Boost.Log 无法与静态库链接
【发布时间】:2016-06-21 12:22:40
【问题描述】:

我正在尝试将 Boost.Log 静态链接到我的程序中。 Boost.Log 已使用 bjam 成功地与其他模块一起编译。但是,当我尝试与我的程序链接时,我收到了一个错误:

g++  -g -O2 -pthread  -o sonar sonar-main.o sonar-config.o sonar-util.o sonar-logger.o /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_system.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_timer.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_iostreams.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_thread.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_log_setup.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_log.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_filesystem.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_atomic.a -lcrypto -lssl  
sonar-logger.o: In function `void boost::log::v2s_mt_posix::basic_formatting_ostream<char, std::char_traits<char>, std::allocator<char> >::aligned_write<wchar_t>(wchar_t const*, long)':
/usr/include/boost/log/utility/formatting_ostream.hpp:702: undefined reference to `boost::log::v2s_mt_posix::aux::code_convert(wchar_t const*, unsigned long, std::string&, std::locale const&)'
/usr/include/boost/log/utility/formatting_ostream.hpp:696: undefined reference to `boost::log::v2s_mt_posix::aux::code_convert(wchar_t const*, unsigned long, std::string&, std::locale const&)'
sonar-logger.o: In function `void boost::log::v2s_mt_posix::type_dispatcher::callback_base::trampoline<boost::log::v2s_mt_posix::binder1st<boost::log::v2s_mt_posix::output_fun, boost::log::v2s_mt_posix::expressions::aux::stream_ref<boost::log::v2s_mt_posix::basic_formatting_ostream<char, std::char_traits<char>, std::allocator<char> > >&>, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >(void*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)':
/usr/include/boost/log/utility/formatting_ostream.hpp:575: undefined reference to `boost::log::v2s_mt_posix::aux::code_convert(wchar_t const*, unsigned long, std::string&, std::locale const&)'
collect2: error: ld returned 1 exit status

我用以下代码编译了 boost:

./b2 --ignore-site-config -a -j9 --with-timer --with-system --with-chrono --with-iostreams --with-log --with-thread variant=debug link=static threading=multi

到目前为止:

  1. 我尝试使用这篇文章 (http://www.boost.org/doc/libs/1_60_0/libs/log/doc/html/log/rationale/namespace_mangling.html) 对其进行故障排除,该文章讨论了它如何成为基于编译的不同命名空间。但是,当我查看 libboost_log.a 时,我可以看到名为“void boost::log::v2s_mt_posix::aux::code_convert
  2. 这篇文章 (https://sourceforge.net/p/boost-log/discussion/710022/thread/2a7b5c0d/) 说要确保 BOOST_LOG_USE_CHAR 和 BOOST_LOG_USE_WCHAR_T 都没有定义。他们不是。
  3. 其他文章说要定义 BOOST_LOG_DYN_LINK,但我使用的是静态库。

这是它在我的 Makefile.am 中的定义方式:

sonar_CPPFLAGS = -march=native -pipe -funroll-loops -fomit-frame-pointer -fforce-addr -fprefetch-loop-arrays -Wall -std=c++0x
sonar_SOURCES = main.cpp \
    config.cpp \
    config.hpp \
    util.cpp \
    util.hpp \
    logger.cpp \
    logger.hpp
sonar_LDADD = /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_system.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_timer.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_iostreams.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_thread.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_log_setup.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_log.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_filesystem.a /home/mike/dev/cpp/boost_1_60_0/stage/lib/libboost_atomic.a -lcrypto -lssl 
sonar_LDFLAGS = -pthread

如何解决此链接器错误?

【问题讨论】:

  • 我怀疑您可能包含来自另一个版本的 Boost 的标头。 1.60 的code_convert 函数都是模板,而旧版本不是。
  • 你是 100% 正确的。我曾是。你想把它变成一个答案,以便我可以投票和接受吗?

标签: c++ boost static-libraries linker-errors boost-log


【解决方案1】:

您可能包含来自旧版本 Boost 的标头。

在 1.60 中,code_convert 系列函数是模板化的,但您看到的错误是对非模板化函数的未定义引用。

【讨论】:

  • 原来我在编译器标志中缺少 -I/home/mike/dev/cpp/boost_1_60_0/ 选项,并且编译器正在使用我为系统安装的头文件。好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多