首页 > 解决方案 > 纠正 Xcode 中的工作流程以避免错误:Architecture x86_64 的重复符号

问题描述

背景

嗨,我正在学习 C++ 和 Xcode 新手。我一直遇到标题中所说的错误,不知道如何解决。我想知道在 Xcode 中学习正确的工作流程是否能帮助我避免这个问题。

这是我的目录:

目录

我这里有:

在项目signal下,我首先创建了一个名为 signalMean的组,其中包含一些文件并且编译得很好。然后我简单地在 signal 下创建了另一个名为 signalVariance 的组完全相同的文件从signalMean复制到这个新组。在我将新函数添加到 main.cpp 文件并将其重命名为signalVariance.cpp 后,我在尝试编译时不断收到重复符号错误。

代码

// waveforms.h
extern double InputSignal_f32_1kHz_15kHz[320];
// waveforms.cpp
#include "waveforms.h"
double InputSignal_f32_1kHz_15kHz[320] =
{+0.0000000000f, +0.5924659585f, -0.0947343455f,...}
// signalMean.cpp
#include <iostream>
#include "waveforms.h"
#define SIG_LENGTH 320

double calc_signal_mean(double *sig_src_arr, int sig_length);
double signal_mean;

int main() {
    //code
}
double calc_signal_mean(double *sig_src_arr, int sig_length) {
    //code
}

错误

duplicate symbol _InputSignal_f32_1kHz_15kHz in:
    .../x86_64/waveforms-c8eb105c3a214768b4cffcf6a99ba09ec9961410b041f2905a2df7e9fe06655e.o
    .../x86_64/waveforms-c8eb105c3a214768b4cffcf6a99ba09e2eac5ae7a592aee13a84d551d65ef983.o
duplicate symbol _main in:
    .../x86_64/signalVariance.o
    .../x86_64/signalMean.o
duplicate symbol _signal_mean in:
    .../x86_64/signalVariance.o
    .../x86_64/signalMean.o
duplicate symbol __Z16calc_signal_meanPdi in:
    .../x86_64/signalVariance.o
    .../x86_64/signalMean.o
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

问题

如果我想继续从以前编写的代码构建项目,Xcode 中的正确工作流程应该是什么以避免这个问题?每个组将代表一个不同的主题/功能,但它们彼此共享代码,将它们放在同一个项目下是有意义的,例如signal

很抱歉,这是一个冗长的问题。如果有人能指出我正确的方向,我将不胜感激。

标签: c++cxcodecompilationlinker

解决方案


我认为您混淆了 Xcode和 Xcode目标

组是在您的项目中组织源代码的一种方法(它们还在文件系统中创建文件夹),但是,对于您的问题至关重要的是,所有源代码都被编译成同一个目标可执行文件。

我认为您想要做的是在项目中创建多个目标,这允许您定义哪些源代码文件属于哪个目标。请参阅有关使用目标的Apple 指南

如果您没有意识到,您不能在单个可执行单元(可执行文件或 dylib)中拥有同一符号(方法或变量)的多个副本。


推荐阅读