[英]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.