2013-02-27 52 views
0

我寫了一個簡單的程序,但越來越重複的符號鏈接錯誤(錯誤下面)有一個在.h文件以外的@interface分數沒有額外的:NSObject的@end蘋果馬赫0鏈接錯誤重複

我對xcode比較陌生。

//SAMPLE CODE 

#import "JTViewController.h" 

@interface Fraction() 

-(void) print; 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 

@end 

@implementation Fraction 

{ 
    int numerator; 
    int denominator; 
} 

-(void) print 
{ 
    NSLog (@"%i/%i", numerator, denominator); 
} 

-(void) setNumerator:(int)n 
{ 
    numerator = n; 
} 

-(void) setDenominator:(int)d 
{ 
    denominator = d; 
} 

@end 

int main (int argc, char * argv[]) 
{ 
    @autoreleasepool { 

     // Create an instance of Fraction and initialise it 

     Fraction *myFraction = [[Fraction alloc] init]; 

     //Set Fraction to 1/3 

      [myFraction setNumerator: 1]; 
      [myFraction setDenominator: 3]; 

      //Display the fraction using the print method 

      [myFraction print]; 
     } 

     return 0; 
    } 

這是錯誤

Ld /Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Products/Debug-iphonesimulator/BrandNew.app/BrandNew normal i386 
    cd /Users/jamesmurray/AppsDev/BrandNew 
    setenv IPHONEOS_DEPLOYMENT_TARGET 6.1 
    setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" 
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk -L/Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Products/Debug-iphonesimulator -F/Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Products/Debug-iphonesimulator -filelist /Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Intermediates/BrandNew.build/Debug-iphonesimulator/BrandNew.build/Objects-normal/i386/BrandNew.LinkFileList -Xlinker -objc_abi_version -Xlinker 2 -fobjc-arc -fobjc-link-runtime -Xlinker -no_implicit_dylibs -mios-simulator-version-min=6.1 -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Products/Debug-iphonesimulator/BrandNew.app/BrandNew 

duplicate symbol _main in: 
    /Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Intermediates/BrandNew.build/Debug-iphonesimulator/BrandNew.build/Objects-normal/i386/main.o 
    /Users/jamesmurray/Library/Developer/Xcode/DerivedData/BrandNew-akqlirretjwoeuaqkrwlbqmlqxlc/Build/Intermediates/BrandNew.build/Debug-iphonesimulator/BrandNew.build/Objects-normal/i386/JTViewController.o 
ld: 1 duplicate symbol for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我不知道它是從哪裏來的。任何援助將不勝感激。

+0

很明顯,在執行JTViewController類的文件中還有另一個'main'函數。 – 2013-02-27 09:55:40

+0

只是一個更新:當我將int main(int ...)更改爲int new name(int ...)時,它會生成。主要導致錯誤的意義是什麼? – Jimmypooza 2013-02-27 09:58:31

+0

您只能擁有1個'main'功能 – Vinzzz 2013-02-27 09:59:08

回答

2

就像鏈接錯誤說,你有兩個main()函數;一個在main.m,另一個在JTViewController.m

刪除JTViewController.m中的一個(將功能移動到main.m)。

0

這裏沒有什麼特別的main。您的對象文件中只能有一個全局可見的非公共符號。非靜態函數是全局可見的和非常見的符號,因此,您只能使用僅定義了一次特定名稱的函數。例如:

a.c

int func() { ... } 

b.c

void func(int arg) { ... } 

當兩個文件進行編譯,它會創建的func名稱(與任何裝修的編譯器可能會應用兩種全局可見符號到符號),儘管參數列表和返回類型不同。由於鏈接器試圖解析所有符號引用以生成最終的可執行文件,因此它面臨着選擇正確版本func的困難選擇,因此它採用最直接的方法 - 只是給出了關於重複符號定義的錯誤並釋放。

這不是C語言特有的要求(Objective-C基本上是C的運行時擴展),因爲它是由系統鏈接器施加的。它還可以翻譯成Objective-C,C++,Fortran,Pascal等許多其他語言。在C++中,函數符號根據它們所在的命名空間和它們的參數列表(前者允許函數重載)進行修飾,在不同的源文件中定義的同一名稱空間中不能有兩個具有相同參數列表的函數。

一般C和C++函數被編譯到全局可見符號,除非施加了static改性劑:

a.c

static int func() { ... } 

b.c

void func(int arg) { ... } 

這將不會導致全局符號funca.o與中的相沖突和鏈接器不會抱怨。如果b.c給出了static處理,或者如果兩個函數都是static,它也可以工作。

相關問題