2014-10-20 203 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曾經對鏈接沒有影響。您必須使用內聯或函數聲明。

相關問題