Kompilieren externe C++ - Bibliothek für die Verwendung mit iOS-Projekt
Ich bin komplett neu in der Verwendung von C++ - Bibliotheken, so schätzen dies möglicherweise ein bisschen zu speziell für meinen Fall (lassen Sie mich wissen, und ich kann weitere Informationen geben).
Ich habe eine externe C++ - Bibliothek, die ich versuche, zur Verwendung mit einem iOS-Projekt. Die Bibliothek folgt einem configure, make, make build-Muster für die Ausgabe .eine Bibliothek-Datei. Wenn ich versuche, und fügen Sie diese Bibliothek-Datei Xcode, bekomme ich die folgende Fehlermeldung:
ignorieren-Datei
/Benutzer/Entwickler/iOS/"TestProj" /libpresage.eine, Datei war
gebaut für Archiv, das ist nicht die Architektur verknüpft wird (i386):/Anwender/Entwickler/iOS/"TestProj" /libpresage.ein
Basierend auf diese Frageich habe versucht, drehen, Bauen, Active-Architektur Nur auf NEIN, und ich bekomme den gleichen Fehler. Dies lässt mich vermuten, dass ich zusammengestellt habe die Bibliothek für die falsche Architektur.
Läuft lipo -info auf der .eine Datei gibt:
input-Datei libpresage.ein ist nicht ein fat-Dateisystem Nicht fat-Datei: libpresage.ein
ist Architektur: x86_64
Gegeben, dass dies nicht armv7s, armv7, oder arm64, ich versuche, und kompilieren Sie das C++ - Bibliothek wieder mit den folgenden Parametern:
1) Versuchen
./configure CC="gcc -arch armv7s" \
CXX="g++ -arch armv7s" \
CPP="gcc -E" CXXCPP="g++ -E"
Fehler beim kompilieren, erhalte ich:
ld: library not found for -lcrt1.3.1.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
2) Versuchen
./configure CC="gcc -arch arm64" \
CXX="g++ -arch arm64" \
CPP="gcc -E" CXXCPP="g++ -E"
Fehler beim kompilieren, erhalte ich:
ld: warning: ld: warning: ignoring file
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib,
fehlen erforderliche arm64-Architektur in der Datei
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libSystem.dylib
(2 Scheiben)ignorieren-Datei
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib,
fehlen erforderliche arm64-Architektur in der Datei
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libstdc++.dylib
(2 Scheiben)ld: dynamische wichtigsten ausführbaren Dateien müssen link mit libSystem.dylib für
Architektur arm64 clang: error: linker command failed with exit-code
1 (mit-v um zu sehen invocation)
Ist es etwas offensichtlich, dass ich bin fehlt?
EDIT:
Danke für die Antworten, also ich habe es geschafft, die library in Xcode, wie eine benutzerdefinierte build-Ziel, indem Sie den "make" - Befehl, um die Bibliotheken MakeFile. Dieser build gut.
Meine Schritte von hier:
- Hinzufügen einer Abhängigkeit von meinem Objective C-iOS-app-target, um die benutzerdefinierte build-target.
- Verweis auf die Bibliothek und eine Objektive C++ - wrapper.
- Dies scheint in Ordnung, bis ich rufen Sie die externe C++ - Bibliothek, dann bekomme ich die Fehlermeldung beim kompilieren:
Undefined symbols for architecture armv7:
"Vorbote::Vorzeichen(PresageCallback*)", verwiesen von:
-[PresageBridge init] in PresageBridge.o
"Vorbote::~Ankündigen()", verwiesen von:
-[PresageBridge init] in PresageBridge.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use-v zu sehen invocation)
- Mein Ziel C++ - wrapper - (Verknüpfung der externen C++ - Standardbibliothek header ankündigen.h):
#import "PresageBridge.h" #include "presage.h" @implementation PresageBridge - (instancetype)init { if(self = [super init]) { Presage hello(&callback); } return self; }
- Basierend auf den obigen code, es scheint nicht, wie mir fehlen die header, und was interessant ist, ich habe auch versucht, erstellen Sie eine Instanz der anderen Klassen in der externen Bibliothek und Sie scheinen zu funktionieren, was darauf schließen lässt, dass Xcode link kann nicht ankündigen.h richtig für einige Grund.
InformationsquelleAutor der Frage HHHH | 2014-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also ich habe viele 3rd-party-C++ - Bibliothek in iOS-Projekten. Es gibt verschiedene Strategien, Menschen für diesen Einsatz. Wie einige schon erwähnt haben, können Sie fügen Sie den code in das Projekt direkt, bauen die statische lib mit Xcode, oder bauen Sie Befehlszeile. Im Fall von cross-Plattform-C++ - libs, die das GNU-konfigurieren-und-build-system, ich bevorzuge die Kommandozeile. Sie nur brauchen, um zu bauen es einmal und Sie haben nur zu überdenken, wenn Sie müssen, aktualisieren Sie die version, oder fügen Sie eine neue Architektur der Scheibe.
Den verallgemeinerten Ansatz, den Sie wollen, ist:
Herauszufinden, die richtige configure-Argumente zu verwenden, um zu bauen auf jeder Scheibe. In der Regel müssen Sie nur konzentrieren sich auf immer eine der arm so gut wie i386 arbeiten. Der rest sind einfach-Sie haben dies getan. In einigen Fällen, die Sie tatsächlich benötigen, ändern Sie die Konfiguration-Datei, fügen Sie den host oder einige andere Anpassungen.
Einmal können Sie bauen alle Scheiben, die Sie ausführen möchten lipo zu bauen eine fat-binary.
Der beste Weg, um damit umzugehen ist, erstellen Sie eine build-Skript wird die ganze Arbeit für Sie. Auf diese Weise, es ist einfacher, Sie zu wiederholen. Noch wichtiger ist, können Sie wiederverwenden, das Skript oder permutiert, es zu bauen, andere externe libs.
Gibt es viele Möglichkeiten, die Sie erstellen können Sie das Skript. Hier ist eine. Zufälligerweise habe ich mehrere Varianten dieser Art von Skript. Dieses Skript wurde verwendet, um cURL. Es mehr oder weniger gearbeitet Vorzeichen, mit sehr wenig mod (ie. ändern curl vorauszuahnen). Hinweis: ich habe nicht testen Sie es in Xcode (ie. die Verknüpfung von it und es läuft). Ich wusste, dass ich hatte zu deaktivieren, sqlite, sonst wird es gebaut, Werkzeug, Gegenstände, die nicht bauen wollen, Recht. Wenn Sie es brauchen, können Sie die Abbildung, dass ein Teil aus.
Gibt es viele Möglichkeiten, die Sie machen könnte es mehr glatt. Zum Beispiel mit einem array zu speichern alle Architekturen. Dies ist nur brute-force.
Die wichtigsten Punkte des Skripts sind:
Beachten Sie, dass es sollte funktionieren out of the box, aber YMMV. Werden Sie bereit zu haben, um zu Debuggen, wenn nötig. Zum Beispiel, ich habe nicht bestätigt das host-Typ, aber im Allgemeinen das ist, was ich schon immer verwendet. Sie möchten, legen Sie diese im Verzeichnis für presage (im selben Verzeichnis wo konfigurieren). Wenn es fertig ist, werden alle Architekturen sind in der Ausgabe-Verzeichnis. Die universal-lib ist in der presage-Verzeichnis.
Denken Sie auch daran, es ist Ihre Verantwortung richtig link in der universal-lib und die header-Dateien durchsuchen Pfad richtig definiert.
InformationsquelleAutor der Antwort Mobile Ben
Wenn man bedenkt, dass Sie neu mit C++ - Bibliotheken, ich denke, Sie müssen tun ein bisschen mehr Forschung.
Allerdings werde ich versuchen zu skizzieren, einige Schritte, die Dinge, die Sie brauchen, um zu berücksichtigen :
Gibt es mehrere Möglichkeiten der Herangehensweise an diese Probleme .
Für das erste würde ich vorschlagen, in Ihrem Arbeitsbereich die statische Bibliothek, und fügen Sie es als Abhängigkeit zu Ihrem Ziel erstellen . Für diese müssen Sie verstehen, XCode-builds.
Ich vermute, dass Sie tatsächlich versuchen, eine Telefon-Anwendung, so dass für die 3. option, die Sie konfigurieren müssen Ihre g++ build-Blick in die iPhoneSDK von XCode bei der Verlinkung arm targets (suchen Sie nach dem iPhoneOS.Plattform).
Machen einen arm bauen funktioniert nur auf iPhones . Wenn Sie wollen, dass es funktioniert auf simulator-Sie müssen Ihre statische Bibliothek Bibliotheken innerhalb des iPhoneSimulator.Plattform.
Wenn Sie möchten, dass Ihre statische Bibliothek zu arbeiten, die sowohl für iPhones und iPhone-simulator, die Sie benötigen, um eine fat-lib (im Grunde eine Bibliothek mit Symbolen für beide Plattformen)
Wenn Sie fehlen, diese Plattformen, die Sie herunterladen können, von XCode (aber ich glaube, Sie sind es)
Wie Sie sehen können, die Dinge kommen mehr und mehr komplexe auf dem Weg, so dass ich stark empfehlen die Verwendung von XCode zum kompilieren Sie die statische Bibliothek (es ist immer noch machbar mit g++ du).
Glaube ich, dass die folgenden Konzepte, die Sie nützlich wäre, um die Forschung auf :
Hoffe, das hilft :).
InformationsquelleAutor der Antwort MichaelCMS
Hier ist was für mich gearbeitet in Xcode 9 für iOS-Geräte (iPhone X):
1) Kompilieren dylib mit diesen flags setzen wie die folgenden:
a) "Installation Directory":
@executable_path/Frameworks
b) "Runpath Search Path":
@executable_path/Frameworks
Siehe das Bild unten:
dylib-Einstellungen in Xcode 9
2) Im Xcode-Projekt, wo die dylib verwendet/verlinkt:
a) "Runpath Search Path":
@executable_path/Frameworks
b) In "Build-Phase->Einbetten der Bibliotheken" stellen Sie sicher, wählen Sie "Ziel" als "ausführbare Dateien" und Unterpfad als "Frameworks", "Code sign-on-copy" geprüft:
Das einstellen der Verknüpfung von der iOS-app
Diese Methode ist getestet und wird mit Xcode 9.2 und iPhone X.
David
InformationsquelleAutor der Antwort us_david
C++ Arbeiten auf iOS, können Sie einfach fügen Sie es in Ihrem Projekt. Oder wenn Sie wirklich wollen, um Ihre dynamische Bibliothek, können Sie es kompilieren mit Xcode und geben Sie Ihre Ziel-Architektur.
InformationsquelleAutor der Antwort debug
Setzen Sie Ihre Architektur auf Standard zurück, dann versuchen Sie die folgenden.
1. In Build-Phasen->Link-Binary Mit Bibliotheken hinzufügen libz.dylib und libxml2.dylib-Bibliotheken in Ihr Projekt ein.
2. In BuildSettings->Suchen-Pfade eingerichtet Suche Immer User-Pfade zu ja, und unter Framework-Suchpfade hinzufügen, den richtigen Pfad zu Ihrem Rahmen. Terminal benutzen, um den richtigen Pfad zu Ihrem Rahmen.
3. Versuchen Sie, Ihren "Compiler-Quelle Als" zu C++ oder verwenden hit-und trial-und-check mit allen Optionen. Complier-Source-Als auch unter BuildSettings. Cmd+f suchen.
Versuchen Sie diese und lassen Sie mich wissen, auch mir sagen, über das framework oder sdk, die Sie verwenden möchten, in Ihr Projekt.
InformationsquelleAutor der Antwort Nauman
Dem Skript von Mobile-Ben ist groß, abgesehen von der letzten Zeile die hardcodes eine Bibliothek mit dem Namen in das Skript ein. Das folgende ist ein Ersatz für die Letzte lipo-Befehl und dynamisch verwendet der lipo führt jede Bibliothek erstellte Datei nach der Kompilierung.
Ändern Mobile-Ben ' s-Linie:
:
Anmerkung: ich wollte nicht zu Bearbeiten Mobile-Ben ' s Antwort mit dem neuen code-Funktionalität, und fügen Sie diese als Kommentar Formatierung verloren.
InformationsquelleAutor der Antwort A.Badger