C++ 除'外定义符号乘法的可能原因;外部';

C++ 除'外定义符号乘法的可能原因;外部';,c++,c,xcode,build,extern,C++,C,Xcode,Build,Extern,“symbol multiply defined”除了在.h中没有声明、将其作为“extern”并在.cpp中实现之外,还有什么其他原因吗 我很确定我的所有文件都遵循规则,但我收到的错误消息如下: ld: lto: could not merge in /Users/zlw/Library/Developer/Xcode/DerivedData/Wireless - amjmgyrircjezdhegioctszbcypz/Build/Intermediates/Wireless.build

“symbol multiply defined”除了在.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”有关

除了“外部”之外还有什么其他原因吗?或者有什么方法可以看出我在Xcode中的代码有什么问题吗


多谢各位

它说,当您编译
qam.cpp
时,您使用了一个名为
Z12SNRFromSNRdBd
(对应于
SNRFromSNRdB(double)
)的符号,该符号被多次定义

您应该搜索该函数以及谁在实现它

注意:要将“损坏的名称”转换为人类可读的名称,可以使用c++过滤器

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

它说,当您编译
qam.cpp
时,您使用了一个名为
Z12SNRFromSNRdBd
(对应于
SNRFromSNRdB(double)
)的符号,该符号被多次定义

您应该搜索该函数以及谁在实现它

注意:要将“损坏的名称”转换为人类可读的名称,可以使用c++过滤器

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

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

我希望您能跳过相关代码。这是清楚的。 我犯了类似的错误,希望能对你有所帮助。 这是一个我在A.h中声明并在A.c中实现的函数,然后我在b.c中调用。它确实起作用。如果我将a.c和b.c更改为a.cpp和b.cpp,则是错误的。
原因是CPP将更改您的多态函数名。

谢谢!这正是问题所在,我已经在两个不同的文件中两次定义了相同的函数SNRFromSNRdB(double)。谢谢!这正是问题所在,我在两个不同的文件中两次定义了相同的函数SNRFromSNRdB(double)。