根据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链接标志?