Xcode C++ :: 重复符号,适用于架构x86_64

14

我是Xcode的新手,当我构建以下代码(MWE)时,我遇到了以下错误:

ld:x86_64架构的3个重复符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

我有三个文件如下:

main.cpp

#include "B.cpp"
int main() {
  square(5);
  return 0;
}

B.cpp

#include "A.cpp"

void square(int n){
  display(n*n);
}

A.cpp

#include <iostream>
using namespace std;

void display(int num){
  cout<<num;
}

我尝试了Stack Overflow上提到的不同方法,比如将“仅构建活动架构”更改为“是”,以及其他一些方法,但错误仍然存在。

2个回答

26
问题在于main.cpp已经包含了B.cppA.cpp。在您的构建过程中,您还编译B.cppA.cpp,并尝试将B.oA.omain.o一起链接。

链接B.oA.o会导致符号displaysquare被多次定义。display被定义了3次,square被定义了2次。

只需编译和构建main.cpp,不要构建A.cppB.cpp

第二种方式是将A.cppB.cpp的内容移到A.hB.h中,并使用inline函数。这样它们就只会被编译一次。

第三种方法是不要在main.cpp中包含B.cpp。只需放置函数声明而不是包含即可。

//main.cpp

void square(int);

int main() {
  square(5);
  return 0;
}

通常,函数声明会放在头文件中。如果在多个情况下需要使用,请制作一个头文件。


谢谢您的建议,我已经按照以下方式尝试了,但错误仍然存在。
  1. 清理项目。
  2. 选择“Main.cpp”。
  3. 产品->执行操作->编译“Main.cpp”。
  4. 重复步骤3,对“A.cpp”和“B.cpp”进行编译。
  5. 运行项目。
  6. 得到相同的错误。
我还尝试只编译“Main.cpp”,然后运行,但XCode会构建整个项目。<br/>请问如何独立编译和构建“Main.cpp”。附:我使用的是XCode 6.1.1。
- Ahmad
@Ahmad,你还没明白。你把同一个源文件放在了两个不同的翻译单元中。A.cpp 中的代码被编译成单一的翻译单元 A.o,然后相同的代码被包含在 main.cpp 中 (这才是 真正的 问题)。这个答案中的第二个选项是理想的。采纳它吧。 - WhozCraig
@WhozCraig 谢谢。我使用了第二个选项,解决了问题。 - Ahmad
谢谢!我使用了第一种解决方案,这解决了我的问题。 - Mira Welner
1
讲解得非常好!非常感谢。我过去两天一直在为这个问题苦恼。 - explorer

2

对我来说,在“Targets->Build Settings->Apple LLVM - Code Generation”下将“No Common Blocks”从Yes更改为No解决了问题。

查看图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接