Wie zu beheben "Neudefinition der enumerator" - Fehler aus separaten objc-frameworks
Sowohl die AuthNet und PayPal mobile-payment-libraries die ENV_LIVE enumerator definiert. Diese reults in Xcode Fehler wie:
Redefinition of enumerator 'ENV_LIVE' ...
In Fällen wie diesem, wo man sich nicht leisten können, ändern Sie einfach den Quellcode des abhängigen frameworks, was sind einige Problemumgehungen verfügbar in objective-c-syntax-oder xcode-Konfiguration?
ZUNÄCHST:
#import "PayPal.h"
#import "AuthNet.h"
...
//AuthNet
[AuthNet authNetWithEnvironment:ENV_TEST];
//PayPal
if (STATUS_COMPLETED_SUCCESS == [PayPal initializationStatus]) {
[PayPal initializeWithAppID:@"APP-XXX" forEnvironment:ENV_SANDBOX];
}
UPDATE (hier ist was ich landete mit als workaround basierend auf die richtige Antwort):
#import "PayPal.h"
@class AuthNet;
#import "AuthNetWorkaround.h"
...
[AuthNet authNetWithEnvironment:AUTHNET_ENV_TEST];
extern const int AUTHNET_ENV_LIVE;
extern const int AUTHNET_ENV_TEST;
@interface AuthNetWorkaround : NSObject
@end
#import "AuthNetWorkaround.h"
#import "AuthNet.h"
@implementation AuthNetWorkaround
const int AUTHNET_ENV_LIVE = ENV_LIVE;
const int AUTHNET_ENV_TEST = ENV_TEST;
@end
Sehen Sie den Fehler, wenn man die Header für beide Rahmen in der gleichen .m-Datei?
Ja, in der selben Datei appdelegate - ich wirklich brauchen, um zu initialisieren, Bibliotheken und verbinden Sie entweder live-oder prod-Server.
Ja, in der selben Datei appdelegate - ich wirklich brauchen, um zu initialisieren, Bibliotheken und verbinden Sie entweder live-oder prod-Server.
InformationsquelleAutor pulkitsinghal | 2012-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht, weil beide Einschlüsse vorkommen, die in der selben compilation unit. Sie können umgehen dieses problem, indem die Aufnahme von Enumerationen, die in einem separaten compilation unit, die Kosten machen, die Werte des Enumerators nicht-compile-Zeit-Konstanten (in der Tat, Sie werden zu globalen Variablen).
In pp_workaround.h:
In pp_workaround.m:
Nun können Sie
"pp_workaround.h"
statt"PayPal.h"
, und verwenden SiePAYPAL_ENV_LIVE
stattENV_LIVE
. Nicht alles wird funktionieren auf die gleiche, aber der compile-Zeit-Fehler sollte Weg sein.BEARBEITEN Wenn Ihr code können Sie importieren Sie die widersprüchlichen Kopfzeilen nur in Ihrem .m-Datei, können Sie das problem zu beheben (anstatt zu arbeiten) durch wickeln der Anschluss-code in eine zusätzliche Abstraktionsschicht von Ihrem eigenen, wie diese:
In der paypal_init.h:
In der paypal_init.m:
in der authnet_init.h:
in der authnet_init.m:
In der main-Datei:
Einige C-Konstrukte erfordern compile-Zeit-Konstanten. Zum Beispiel, wenn Sie müssen ein array deklarieren
int vals[ENV_MAX]
der standard verlangtENV_MAX
zu einem compile-Zeit-Konstante. Der compiler wird immer sagen, dass etwas gebrochen ist, obwohl, so dass, wenn alles kompiliert, Sie werden in Ordnung sein.thanks a bunch für die Aufbewahrung dieser CD. ich ... ich folgte der extern beraten und bin mit in
Undefined symbols for architecture i386: "_OBJC_CLASS_$_AuthNet", referenced from: objc-class-ref in Shoppin_PalAppDelegate.o objc-class-ref in CardProcessingUtils.o (maybe you meant: _OBJC_CLASS_$_AuthNetWorkaround)
BTW habe ich beschlossen, um extern die authnet Sachen über das paypal Zeug
Es sieht aus wie Sie nicht fügen Sie die AuthNet Bibliothek zu Ihrem Projekt richtig. Wenn Sie suchen, sagen, Google, für "Undefined symbols for architecture i386" finden Sie mehrere Vorschläge, wie man dieses Problem beheben link problem; hier ist.
InformationsquelleAutor dasblinkenlight
Ich hatte gerade diese Fehlermeldung, und eine saubere vor dem Gebäude behoben das Problem für mich.
InformationsquelleAutor Natan R.