任何小于“-O2”的“重复符号”

时间:2013-12-05 18:57:47

标签: c++ xcode linker clang compiler-optimization

我正在尝试使用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

所以有两个问题:

  1. 理论上,为什么优化级别应该改变链接器输出?
  2. 有谁知道如何解决这个问题?我无法真正发布代码,但很乐意接受有用的猜测。

1 个答案:

答案 0 :(得分:3)

  

重复符号__Z7CONTROLSs12CONTROL_TYPEff

这通常发生在头文件中定义内联函数时,但忽略使用inline关键字声明它。

  

理论上,为什么优化级别应该改变链接器输出?

使用优化构建时,编译器实际上 内联函数,并且不会发出“out of line”定义,从而导致链接成功。

您可以通过运行nm main.o | grep __Z7CONTROLSs12CONTROL_TYPEff来验证这一点 - 优化开启,我希望没有输出。

  

我如何解决这个问题

添加缺少的inline,或将函数的定义移出头文件,并转移到常规的C ++源代码中。