簡體   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