Apple Mach-0链接器错误重复

时间:2013-02-27 09:53:09

标签: objective-c xcode linker-errors duplicate-symbol

我编写了一个直接的程序,但是获得了重复的符号链接器错误(下面的错误).h文件除了@interface Fraction之外没有其他内容:NSObject @end

我对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)

我不知道它来自哪里。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

就像链接器错误所说,你有两个main()函数; main.m中的一个和JTViewController.m中的一个。

删除JTViewController.m中的一个(将功能移至main.m)。

答案 1 :(得分:0)

这里main没有什么特别之处。在目标文件中只能有一个全局可见的非公共符号。非静态函数是全局可见和非公共符号,因此您只能使用仅定义一次特定名称的函数。例如:

a.c

int func() { ... }

b.c

void func(int arg) { ... }

当两个文件都被编译时,它会创建两个全局可见的符号,其名称为func(编码器可能对符号应用的任何装饰),尽管参数列表和返回类型不同。当链接器尝试解析所有符号引用以生成最终的可执行文件时,它面临选择正确版本的func的艰难选择,因此它采用最直接的方法 - 只是给出关于重复符号的错误定义和纾困。

这不是C语言特有的要求(而Objective-C基本上是C的运行时扩展),因为它是由系统链接器强加的。它还可以转换为许多其他语言,如Objective-C,C ++,Fortran,Pascal等。在C ++中,函数符号根据它们所在的命名空间和它们的参数列表进行修饰(前者启用函数重载),但同样一个不能在不同源文件中定义的同一命名空间中具有相同的参数列表的两个函数。

除非应用static修饰符,否则通常将C和C ++函数编译为全局可见符号:

a.c

static int func() { ... }

b.c

void func(int arg) { ... }

这不会导致func中的全局符号a.ob.o中的符号冲突,并且链接器不会抱怨。如果func中的b.cstatic处理,或者两个函数都是static,那么它也会有效。