繁体   English   中英

链接器命令失败,退出代码为1 C ++ Xcode

[英]linker command failed with exit code 1 C++ Xcode

我的项目中有5个文件:stack.h,stack.cpp,calc.h,calc.cpp和main.cpp。 我包含在main.cpp中-stack.h和calc.h,在calc.cpp中包含了stack.h和calc.h。 在stack.h和calc.h中,我曾经编写#pragma once 在stack.cpp中,我包含了stack.h。 因此,但是在构建项目后,出现链接器错误:

Ld /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Products/Debug/Calculator normal x86_64
    cd /Users/ratkke/Desktop/Calculator
    export MACOSX_DEPLOYMENT_TARGET=10.10
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -L/Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Products/Debug -F/Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Products/Debug -filelist /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/Calculator.LinkFileList -mmacosx-version-min=10.10 -stdlib=libc++ -Xlinker -dependency_info -Xlinker /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/Calculator_dependency_info.dat -o /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Products/Debug/Calculator

duplicate symbol __Z11getPriorityc in:
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/main.o
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/calc.o
duplicate symbol __Z10isOperatorc in:
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/main.o
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/calc.o
duplicate symbol __Z8isNumberc in:
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/main.o
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/calc.o
duplicate symbol __Z11getOperatorc in:
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/main.o
    /Users/ratkke/Library/Developer/Xcode/DerivedData/Calculator-esrbpuwjualqxkenoegznrxlvebi/Build/Intermediates/Calculator.build/Debug/Calculator.build/Objects-normal/x86_64/calc.o
ld: 4 duplicate symbols for architecture x86_64

而且我不知道为什么错误存在。

一次编译将仅对您当前正在编译的对象产生影响。 示例:如果main包括stack.h和calc.h,而calc.h也包括stack.h,那么一旦您不使用“ #pragma一次”构建了main.cpp,您将最终两次拥有stack.h(可以看到,如果在预处理器之后立即停止编译,请参见此处的GCC预处理器 )。

但是,编译指示曾经对链接没有影响。 因为您以不同的步骤构建main.o,stack.o和calc.o,然后将它们链接到应用程序,所以每个对象都将包含可能添加到标头中的函数。 因此,您最终在main.o和calc.o中获得了getPrity()的函数体。

您可以将标头声明为静态函数,如下所示

static int getPriority() {
    return 0;
}

或者,如果您使用的是c ++,则将它们放在一个匿名的命名空间中:

namespace {
    int getPriority() { 
        return 0;
    }
}

最好将函数声明放在.h文件中,并将函数定义放在.cpp文件中。

因此,根据您的情况,将以下语句放入calc.h文件中。

int getPriority();

然后将函数定义放在calc.cpp中

int getPriority() {
    // More functionality 
    return 0;
}

如果功能较小,则可以使用内联。 如其他答案所述,#pragma一次对链接没有影响。 您必须使用内联或函数声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM