根据ld手册页,-x link标志禁止将非全局符号放入输出文件的符号表中.这些符号对于调试很有用,但在运行时不使用.但是这个标志在Mavericks上造成链接错误.例如,以下源文件:
struct Yo { Yo() {} }; void useYo() { Yo yo; }
编译/链接如下:
c++ -arch x86_64 -bundle -Wl,-x -o tc.so tc.cpp
产生以下输出:
ld: internal error: atom not found in symbolIndex(__ZN2YoC1Ev) for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
构造函数Yo :: Yo()是问题所在:
c++filt __ZN2YoC1Ev Yo::Yo()
删除-x链接标志可以解决问题.在构造声明之外移动构造函数实现也可以解决问题.这段代码编译/链接很好:
struct Yo { Yo(); }; Yo::Yo() {} void useYo() { Yo yo; }
这是我的编译器信息:
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) Target: x86_64-apple-darwin13.3.0 Thread model: posix
这是clang或链接器中的错误,还是有一些原因我不应该使用-x链接标志?