2014-10-20 209 views
0

我在我的项目中有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 

而且我不知道为什么错误是存在的。提前谢谢你的帮助!

+0

是在main.cpp和calc.cpp中定义的getPriority方法 – radar 2014-10-20 15:57:43

回答

0

编译指示一次只会影响您正在编译的对象。例如:如果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; 
    } 
} 
+0

我实际上推荐使用inline来代替,因为静态函数每个转换单元都有一个定义,因此如果没有优化,会大量膨胀所产生的编译代码(Visual除非进行优化你实际上设置了一些标志,例如2013年),而内联每个功能都有1个主体 – Creris 2014-10-20 17:37:58

0

它总是更好将.h文件中的函数声明和函数定义放在.cpp文件中。

所以在你的情况下,在calc.h文件中加入以下语句。

int getPriority();

,然后把函数定义calc.cpp

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

如果功能很小,那么你可以使用内联。 正如其他答案中所解释的#pragma曾经对链接没有影响。您必须使用内联或函数声明。

相关问题