符号乘法定义的可能原因除了'extern'之外

时间:2013-10-16 07:17:51

标签: c++ c xcode build extern

除了没有.h中的声明,将它作为'extern',并且在.cpp中实现了吗?

是否有任何'符号乘法定义'的原因

我很确定我的所有文件都遵循规则,但我收到的错误信息如下:

ld: lto: could not merge in /Users/zlw/Library/Developer/Xcode/DerivedData/Wireless -  
amjmgyrircjezdhegioctszbcypz/Build/Intermediates/Wireless.build/Debug/Wireless.build/Objects 
normal/x86_64/qam.o because 'Linking globals named '_Z12SNRFromSNRdBd': symbol multiply 
defined!', using libLTO version 'LLVM version 3.3svn, from Apple Clang 5.0 (build 
500.2.76)' for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

消息是否意味着所有麻烦都与'qam.h'或'qam.cpp'有关?

是否还有其他'extern'的原因,或者有什么方法可以查看我在Xcode中的代码有什么问题?

非常感谢!

2 个答案:

答案 0 :(得分:5)

它说当你编译qam.cpp时,你使用一个名为_Z12SNRFromSNRdBd的符号(对应于SNRFromSNRdB(double)),这个符号定义了不止一次。

您应该搜索该功能以及实施该功能的人。

注意:要将“受损名称”转换为人类可读,您可以使用c ++ filt

bruce@lorien:~$ c++filt _Z12SNRFromSNRdBd
SNRFromSNRdB(double)

答案 1 :(得分:0)

我希望您可以通过相关代码。这很清楚。 我得到了类似的错误,希望对你有所帮助。 这是一个函数我在a.h中声明并在a.c中实现,然后我在b.c中调用。它确实有效。如果我将a.c和b.c更改为a.cpp和b.cpp,那就错了。 原因是CPP将更改多态的函数名称。