我正在使用一段匿名命名空间中具有boost::error_info
typedef的代码。代码编译并链接精细,除非我使用-O1
标志。这是一个最小的例子:
TEST.CPP
#include <boost/exception/all.hpp> namespace { typedef boost::error_info< struct tag_err_val, int > err_val; } int main() { err_val(42); }
这可以编译并链接任何这些clang的调用:
$ clang++ test.cpp -O0 -o test
$ clang++ test.cpp -O2 -o test
$ clang++ test.cpp -O3 -o test
但如果我使用-O1
,则会发生这种情况:
$ clang++ test.cpp -O1 -o test
Undefined symbols for architecture x86_64:
"std::__1::basic_ios<char, std::__1::char_traits<char> >::fill(char)", referenced from:
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > boost::exception_detail::object_hex_dump<boost::error_info<(anonymous namespace)::tag_err_val, int> >(boost::error_info<(anonymous namespace)::tag_err_val, int> const&, unsigned long) in test-30d00d.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
问题已解决&#39;通过将typedef移出匿名命名空间。但为什么这个链接错误只发生在一个优化级别?是什么导致了它?
注意:我使用的是boost 1.64和Apple clang ++ 8.1.0