在 OSX El Capitan 中使用 Homebrew 的 Boost::Log 链接错误
Posted
技术标签:
【中文标题】在 OSX El Capitan 中使用 Homebrew 的 Boost::Log 链接错误【英文标题】:Link errors using Homebrew's Boost::Log in OSX El Capitan 【发布时间】:2016-03-20 17:50:29 【问题描述】:OSX 10.11.3 (El Capitan)
我在构建 Boost::Log 教程中的 first example 时遇到链接错误。
#include <boost/log/trivial.hpp>
int main(int, char*[])
BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
BOOST_LOG_TRIVIAL(info) << "An informational severity message";
BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
BOOST_LOG_TRIVIAL(error) << "An error severity message";
BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
return 0;
以下是诊断:
$ c++ trivial_log_test.cpp
Undefined symbols for architecture x86_64:
"boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", referenced from:
boost::log::v2s_mt_posix::record::reset() in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*)", referenced from:
boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::auto_release::~auto_release() in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&)", referenced from:
boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>&, boost::log::v2s_mt_posix::record&) in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::aux::unhandled_exception_count()", referenced from:
boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>&, boost::log::v2s_mt_posix::record&) in trivial_log_test-6968b8.o
boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::~record_pump() in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&)", referenced from:
boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> const&) in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&)", referenced from:
boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::push_record_unlocked(boost::rv<boost::log::v2s_mt_posix::record>&) in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::sources::aux::get_severity_level()", referenced from:
boost::log::v2s_mt_posix::sources::aux::severity_level<boost::log::v2s_mt_posix::trivial::severity_level>::set_value(boost::log::v2s_mt_posix::trivial::severity_level) in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::trivial::logger::get()", referenced from:
_main in trivial_log_test-6968b8.o
"boost::log::v2s_mt_posix::core::get_logging_enabled() const", referenced from:
boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<boost::log::v2s_mt_posix::trivial::severity_level>, void, void, void, void, void, void, void, void, void> >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> const&) in trivial_log_test-6968b8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
几个类似的问题说以下提供了有用的信息:
$ clang++ -E -x c++ - -v < /dev/null
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.11.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -E -disable-free -disable-llvm-verifier -main-file-name - -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 253.9 -v -dwarf-column-info -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2 -stdlib=libc++ -fdeprecated-macro -fdebug-compilation-dir /Users/chap/private/cpp/BOOST_TESTING/log_test -ferror-limit 19 -fmessage-length 176 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.11.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o - -x c++ -
clang -cc1 version 7.0.2 based upon LLVM 3.7.0svn default target x86_64-apple-darwin15.3.0
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 332 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2
Homebrew 已安装并且是最新的。我重新安装了 Boost:
$ brew reinstall boost
==> Reinstalling boost
==> Downloading https://homebrew.bintray.com/bottles/boost-1.60.0_1.el_capitan.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/boost-1.60.0_1.el_capitan.bottle.tar.gz
==> Pouring boost-1.60.0_1.el_capitan.bottle.tar.gz
???? /usr/local/Cellar/boost/1.60.0_1: 11,139 files, 436.0M
在有关使用 Boost 库的链接错误的其他类似问题中,一个常见的解决方案是运行 bootstrap.sh
来构建 b2
可执行文件来编译一些库。然而,这些人在安装 Boost 时没有使用 Homebrew。 Homebrew 的 Boost 安装看起来与 Boost 'getting started' page 描述的目录结构不同 - 特别是它不包含 bootstrap.sh
脚本或 b2
二进制文件。这让我觉得brew install boost
已经处理好了。
有人可以建议下一步吗?
更新 1:更正了关于 bootstrap.sh 和 b2 的声明。
【问题讨论】:
阅读“入门”文档?他们描述了一个名为bootstrap.sh
的脚本,它构建了b2
。 (这是一个可执行文件,而不是脚本)
@MarshallClow 我的健忘 - 我已经更正了我的陈述。我的意思是 bootstrap.sh 脚本。这和 b2 都不在 Homebrew 安装中。
出现链接错误的原因是 Boost.Log 不是一个仅包含标头的库。在构建 boost 库之后,您必须将其链接到您的可执行文件中。但是,这对您的bootstrap.sh
或b2
问题没有帮助。
【参考方案1】:
Homebrew 邮件列表中的某个人提供的解决方案是使用以下标志编译我的程序:
c++ -DBOOST_LOG_DYN_LINK -lboost_log-mt trivial_log_test.cpp
自从我得到了 Boost“瓶子”,我得到了二进制库的预构建版本。不需要bootstrap.sh
/ b2
。
【讨论】:
以上是关于在 OSX El Capitan 中使用 Homebrew 的 Boost::Log 链接错误的主要内容,如果未能解决你的问题,请参考以下文章
graphviz 错误:点:无法打开 hello.dot(OSX El Capitan)
在 OSX 10.11 El Capitan 上安装 therubyracer gem
如何在 Python opencv 3.2.0 OSX El Capitan 中手动设置 Facetime 高清摄像头的曝光
使用 OSX 10.11 Beta 5 (El Capitan) 设置 IPv6 环境