仅在匿名命名空间中对boost :: error_info使用-O1时出现链接器错误

时间:2017-11-07 11:20:16

标签: c++ boost clang++

我正在使用一段匿名命名空间中具有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

0 个答案:

没有答案