【问题标题】:Xcode C++ :: Duplicate Symbols for Architecture x86_64Xcode C++ :: 架构 x86_64 的重复符号
【发布时间】:2015-02-10 18:30:11
【问题描述】:

我是 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;
}

我尝试了堆栈溢出中提到的不同方法,例如将“仅构建活动架构”更改为“是”等,但错误仍然存​​在。

【问题讨论】:

    标签: c++ xcode xcode6 clang


    【解决方案1】:

    问题是main.cpp 包含了B.cppA.cpp。在您的构建过程中,您还编译B.cppA.cpp 并尝试链接B.oA.o 以及main.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. 对“A.cpp”和“B.cpp”重复步骤 3 5. 运行项目。 6. 得到同样的错误。我也尝试只编译“Main.cpp”然后运行,但XCode构建了完整的项目。
      您能否详细说明如何独立编译和构建“Main.cpp”。附言我正在使用 XCode 6.1.1
    • @Ahmad 你还是没明白。您在两个不同的翻译单元中包含相同的来源。 A.cpp 中的代码被编译为单个翻译单元到A.o,然后相同的代码#include-ed 到main.cpp(这是真正的 问题)。此答案中的第二个选项是理想的。这样做。
    • @WhozCraig 谢谢。我使用了第二个选项,解决了这个问题。
    • 谢谢!我使用了第一个解决方案,这解决了我的问题
    • 解释得很好!非常感谢。过去 2 天我一直被这个问题困扰。
    【解决方案2】:

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

    enter image description here

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2022-06-13
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多