0

我定义了一个操纵器:

inline std::ostream& my_manip(std::ostream& os);

我使用的是这样的:

std::cout << my_manip << ...;

所有这些都可以在调试和发布模式下使用 Boost.bjam 编译。但是,当需要链接时,我仅在发布模式下收到以下错误:

Undefined symbols for architecture x86_64:
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >& (*)(std::__1::basic_ostream<char, std::__1::char_traits<char> >&))", referenced from:
      my_routine in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

或者,更清楚地说:

Undefined symbols for architecture x86_64:
  "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from:
      my_routine in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我注释掉操纵器,一切都在调试和发布模式下编译和链接都很好。

如果我留在操纵器中,我可以通过使用 重建项目来解决链接器错误-O0,但是如果我的发布模式是 bjam 默认值 ( -O3),我会更喜欢它。

我正在运行 Xcode 4.6.2 及其相关的 clang:

Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

如何让这个操纵器与优化正确链接?

4

1 回答 1

1

放下inline. 我怀疑您在某个标题中声明了操纵器并且仅在一个翻译单元中定义?随着inline您正在更改符号的可见性,这可能意味着编译器生成了函数但它没有导出符号以便其他翻译单元可以看到它,即链接器找不到它。

于 2013-10-29T17:20:27.243 回答