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

リンカー エラーが言うように、2 つのmain()関数があります。1つと1main.mJTViewController.m

の 1 つを削除しJTViewController.mます (機能を に移動しますmain.m)。

于 2013-02-27T09:56:33.377 に答える
0

ここには特別なことは何もありませんmain。オブジェクト ファイルには、グローバルに表示される非共通シンボルを 1 つだけ含めることができます。非静的関数はグローバルに可視であり、一般的でないシンボルであるため、特定の名前を持つ関数は 1 回しか定義できません。例えば:

a.c:

int func() { ... }

b.c:

void func(int arg) { ... }

両方のファイルがコンパイルされるfuncと、引数リストと戻り値の型の違いにもかかわらず、(コンパイラがシンボルに適用する可能性のある装飾を使用して) という名前の 2 つのグローバルに表示されるシンボルが作成されます。リンカーは、最終的な実行可能ファイルを生成するためにすべてのシンボル参照を解決しようとするため、適切なバージョンの を選択するという難しい選択に直面するfuncため、最も直接的なアプローチを採用します。つまり、シンボル定義の重複に関するエラーを表示し、救済します。

これは、C 言語に固有の要件ではありません (また、Objective-C は基本的に C のランタイム拡張です)。これは、システム リンカーによって課されるものです。また、Objective-C、C++、Fortran、Pascal などの他の多くの言語にも変換されます。C++ では、関数シンボルは、それらが存在する名前空間とその引数のリストに従って装飾されます (前者は関数のオーバーロードを可能にします)。異なるソース ファイルで定義された同じ名前空間に、同じ引数リストを持つ 2 つの関数を含めることはできません。

static通常、修飾子が適用されない限り、C および C++ 関数はグローバルに可視のシンボルにコンパイルされます。

a.c:

static int func() { ... }

b.c:

void func(int arg) { ... }

これにより、グローバル シンボルfunca.o1 つと衝突するb.oことはなく、リンカは文句を言いません。むしろfuncinb.cstatic処理されている場合、または両方の機能が である場合にも機能しますstatic

于 2013-02-27T13:42:24.607 に答える