我正在尝试使用clang编译一个大型源代码树,其默认设置为调试模式,直到现在为-O3
。遗憾的是,它优化了许多关键的调试信息,但是当我将xcode中的优化级别设置为小于-O2
的任何值时,比如说-O0
,链接器开始提供重复的符号错误。
duplicate symbol __Z7CONTROLSs12CONTROL_TYPEff in:
/Users/... /main.o
/Users/... /ofxCocoa.o
...
ld: 8 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1
所以有两个问题:
答案 0 :(得分:3)
重复符号__Z7CONTROLSs12CONTROL_TYPEff
这通常发生在头文件中定义内联函数时,但忽略使用inline
关键字声明它。
理论上,为什么优化级别应该改变链接器输出?
使用优化构建时,编译器实际上 内联函数,并且不会发出“out of line”定义,从而导致链接成功。
您可以通过运行nm main.o | grep __Z7CONTROLSs12CONTROL_TYPEff
来验证这一点 - 优化开启,我希望没有输出。
我如何解决这个问题
添加缺少的inline
,或将函数的定义移出头文件,并转移到常规的C ++源代码中。