0

我已经编写了一个简单的程序,但是出现重复的符号链接器错误(下面的错误)除了@interface Fraction 之外,.h 文件中没有任何其他内容: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)

我不知道它是从哪里来的。任何援助将不胜感激。

4

2 回答 2

2

就像链接器错误所说的那样,您有两个main()功能;一进main.m一进JTViewController.m

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

于 2013-02-27T09:56:33.377 回答
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) { ... }

这不会导致全局符号与funcina.o发生冲突,b.o链接器也不会抱怨。如果funcinb.c给予static治疗或如果两个功能都是,它也将起作用static

于 2013-02-27T13:42:24.607 回答