ld: doppeltes Symbol – verursacht durch const

Lesezeit: 3 Minuten

Benutzer-Avatar
Brian.klar

Ich habe einen NSString definiert, der als Fehlerdomäne in NSError verwendet werden soll, und habe kopiert, wie sich ASIHttpRequest dort verhält.

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

Ich habe die Konstante in eine eigene .h-Datei // FPServerAPICoordinatorConstants.h gesteckt

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h
#define FirePlayer_FPServerAPICoordinatorConstants_h

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

#endif

aber wenn ich es in mehr als einem .m

SomeFile.m

#import "FPServerAPICoordinatorConstants.h"

SomeOtherFile.m

#import "FPServerAPICoordinatorConstants.h"

Ich habe einen Linker-Fehler ‘doppeltes Symbol’

ld: duplicate symbol _FPServerAPIErrorDomain in SomeFile.o and ....SomeOtherFile.o for architecture armv7

Also ändere ich die Konstante in #define und es hat gut funktioniert.

//  FPServerAPICoordinatorConstants.h

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h
#define FirePlayer_FPServerAPICoordinatorConstants_h


//THIS WAS TRIGGERING link errors
//NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
//working OK
#define FPServerAPIErrorDomain @"FPServerAPIErrorDomain"

#endif

Aber gibt es eine Möglichkeit, die Konstante im globalen Raum dazu zu bringen, kein “doppeltes Symbol” zu werfen?

  • Wenn Sie die Include-Datei Magic weglassen, ist Ihre Frage dieselbe wie: “Kann ich tun const int i=42; zweimal in der gleichen Quelle/Binärdatei?

    – Jörg Beyer

    6. März 2012 um 12:18 Uhr

  • ja, aber auch ‘wie benutzt man #defines NICHT und benutzt const im globalen Raum’? ist es möglich? ist es bevorzugt? #define funktioniert, aber warum gibt es dann consts? Ich bin eine Java-Person, die zu Obj-c gezogen ist. Ich habe mich noch nicht in Voodoo 101 qualifiziert

    – brian.klar

    6. März 2012 um 12:23 Uhr

  • Sie haben überhaupt nicht kopiert, was ASIHttpRequest tut. Gehen Sie zurück und schauen Sie noch einmal.

    – Hooleyhoop

    6. März 2012 um 12:38 Uhr

In Ihrer Header-Datei möchten Sie:

extern NSString *const FPServerAPIErrorDomain;

und dann in einer Implementierungsdatei (also möchten Sie wahrscheinlich eine FPServerAPICoordinatorConstants.m) du wirst wollen:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

Dann können Sie den Header in mehrere Dateien importieren und erhalten keine doppelten Symbolfehler.

[By the way, you don’t need the #ifndef guards if you’re using #import.]

  • Ha! Apple hat die ifndef eingefügt 🙂 als ich die Header-Datei aus Vorlagen hinzugefügt habe

    – brian.klar

    6. März 2012 um 12:37 Uhr

  • Das liegt wahrscheinlich daran, dass Sie aus einer “C-Header”-Vorlage hinzugefügt haben. Dadurch sind sie standardmäßig so vorhanden, wie Sie es möchten, wenn Sie den C-Stil verwenden #includes. Aber Sie verwenden den Objective-C-Stil #imports. Also weg mit den Wachen.

    – mattjgalloway

    6. März 2012 um 12:39 Uhr

  • Vielen Dank für Ihre Antwort. Sparen Sie Zeit für mich.

    – Yanhua

    27. Dezember 2013 um 4:28 Uhr

Es ist nicht möglich, dieselbe (globale) Variable zweimal im selben Namensraum zu instanziieren (, ohne einen Fehler zu erhalten).

  • Gibt es einen Vorteil bei der Verwendung von //NSString* const FPServerAPIErrorDomain = @”FPServerAPIErrorDomain”; über #define FPServerAPIErrorDomain @”FPServerAPIErrorDomain”

    – brian.klar

    6. März 2012 um 12:39 Uhr


Jedes Symbol sollte nur einmal definiert werden; das heißt, es sollte nur in einer m-Datei definiert werden. Indem die Definition in eine Header-Datei eingefügt wird, wird sie in jeder m-Datei definiert, die diesen Header enthält.

Definieren Sie es in einer Ihrer m-Dateien (je nachdem, was am relevantesten ist) und ändern Sie den Header in eine Deklaration (mit dem Schlüsselwort extern).

Die Definition schafft Platz für die Daten; Die Deklaration teilt dem Compiler einfach mit, dass es an anderer Stelle eine Definition gibt. Daher muss jede m-Datei, die die Konstante verwendet, eine Deklaration haben, aber nur eine m-Datei sollte die Definition haben.

  • Gibt es einen Vorteil bei der Verwendung von //NSString* const FPServerAPIErrorDomain = @”FPServerAPIErrorDomain”; über #define FPServerAPIErrorDomain @”FPServerAPIErrorDomain”

    – brian.klar

    6. März 2012 um 12:40 Uhr

1257100cookie-checkld: doppeltes Symbol – verursacht durch const

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy