链接器命令失败,退出代码1с++ 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。所以,但之后,我建我的项目,我有链接错误:链接器命令失败,退出代码1с++ xcode
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 once”(你可以看到,如果您在预处理器后面停止编译,请参阅此处GCC preprocessor)。
但是编译指示一次对连接没有影响。因为您在不同的步骤中构建main.o,stack.o和calc.o,之后将它们链接到应用程序,每个对象都将包含可能添加到标题中的函数。所以你最终在main.o和calc.o中使用了getPrity()函数体。
你可以声明函数的头是静态的,这样
static int getPriority() {
return 0;
}
,或者你将它们用一个匿名命名空间,如果你使用的是C++:
namespace {
int getPriority() {
return 0;
}
}
我实际上推荐使用inline来代替,因为静态函数每个转换单元都有一个定义,因此如果没有优化,会大量膨胀所产生的编译代码(Visual除非进行优化你实际上设置了一些标志,例如2013年),而内联每个功能都有1个主体 – Creris 2014-10-20 17:37:58
它总是更好将.h文件中的函数声明和函数定义放在.cpp文件中。
所以在你的情况下,在calc.h文件中加入以下语句。
int getPriority();
,然后把函数定义calc.cpp
int getPriority() {
// More functionality
return 0;
}
如果功能很小,那么你可以使用内联。 正如其他答案中所解释的#pragma曾经对链接没有影响。您必须使用内联或函数声明。
是在main.cpp和calc.cpp中定义的getPriority方法 – radar 2014-10-20 15:57:43