4 Stimmen

Wie kann ich beim Schreiben von CodeRunner-Dokumenten Bibliotheken einbinden, die nicht zum Framework gehören?

Ich habe mit CodeRunner um kleine Codestücke zu sammeln, die bei der Entwicklung häufig verwendet werden, aber nicht unbedingt in die Codebasis eines Projekts gehören. Es ist ein großartiges Tool für die Zusammenfassung in Objective-C und Cocoa, weil ich Frameworks einbeziehen kann, die auf meinem Rechner installiert sind.

Manchmal möchte ich jedoch Funktionen aus externen Quellen einbinden, die keine Frameworks sind, wie z. B. ASIHTTPRequest. Wenn ich die ASIHTTPRequest-Dateien in einem Ordner in der Nähe platziere und #include erhalte ich Fehlermeldungen über "Undefined symbols for architecture x86_64: _OBJC_CLASS_$_ASIHTTPRequest" was vermutlich bedeutet, dass die ASI-Dateien einfach nicht kompiliert und mit dem CodeRunner-Dokument verlinkt werden - es handelt sich um eine einzelne Datei, die kompiliert wird, nicht um ein Projekt. In Xcode würde ich die ASIHTTPRequest-Dateien zum Projekt hinzufügen und sie würden automatisch kompiliert und mit dem Rest des Codes verknüpft werden, was ist das Äquivalent, wenn ich nicht mit Xcode bin?

Ich kann benutzerdefinierte Argumente und Kompilierungsflags einfügen (letztere enthalten -std=c99 -framework Foundation standardmäßig) und ich vermute, dass ich diese irgendwie ändern muss, aber ich habe nicht herausfinden können, wie.

3voto

Brad Choate Punkte 570

Ich habe es zum Laufen gebracht. gcc benötigt natürlich einige zusätzliche Parameter, um mit den ASIHTTP-Modulen zu linken. Hier ist, was ich am Ende hatte:

-std=c99 -framework SystemConfiguration -framework CoreServices -framework Foundation -lz -I/path/to/asi-header-files -filelist /path/to/list-of-asi-compiled-modules

Ich vermute, dass Ihr Code nur Pfade zu den ASIHTTPRequest.h, etc. Header-Dateien ... wenn Sie explizite Pfade dort verwenden, benötigen Sie nicht die -I-Schalter oben. gcc muss eine kompilierte Version des Codes von ASIHTTPRequest.m und Freunde haben, um mit ihm zu verknüpfen. Eine Möglichkeit, das zu tun, ist, das "Mac"-Projekt zu kompilieren, das mit der Bibliothek geliefert wird. Das wird .o-Dateien in einem dieser tief vergrabenen "DerivedData"-Verzeichnisse erzeugen, die Xcode gerne erstellt. Die eine es für mich gemacht ist:

~/Library/Developer/Xcode/DerivedData/Mac-flsjygxmngizhzfwnfgcakejmwkx/Build/Intermediates/Mac.build/Debug/Mac.build/Objects-normal/x86_64

(Das "Mac-flsjygxmngizhzfwnfgcakejmwkx"-Bit wird bei Ihnen anders lauten, nehme ich an.) In diesem Verzeichnis gibt es eine Reihe von .o-Dateien und eine "Mac.LinkFileList"-Datei. Diese Datei ist diejenige, die Sie für den Parameter -filelist an gcc übergeben. Sie müssen die Verweise auf die Dateien main.o, AppDelegate.o und ASIWebPageRequest.o entfernen, damit Sie während des Link-Schrittes keine doppelten Symbolfehler erhalten.

Zusätzlich zu den ASIHTTPRequest Header- und .o-Dateien erwartet der gcc, dass er mit den SystemConfiguration- und CoreServices-Frameworks und der zlib-Bibliothek gelinkt wird, da ASIHTTPRequest diese Abhängigkeiten hat.

Wenn Sie viele Tests mit dieser Bibliothek durchführen, würde ich empfehlen, die "Objective-C" Sprachdefinition (unter Preferences) als "Objective-C with ASIHTTPRequest" oder so zu duplizieren. Dann können Sie die Kompilierungsflags für die Ausführung gegen ASIHTTPRequest anpassen, ohne dass dies für den gesamten Objective-C-Code, den Sie ausführen, geschehen muss.

Möglicherweise möchten Sie auch die .o-Dateien und die "LinkFileList"-Datei an einen dauerhaften Ort kopieren, nur für den Fall, dass Xcode den Build-Tree bereinigt oder so.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X