Wie Baue Intensivstation, so kann ich es verwenden in einer iPhone-app?
Wie kann ich die Konfiguration und den Aufbau der Intensivstation, so kann ich einen link auf meine iPhone-app?
Pflege ich eine iPhone app, die verwendet eine SQLite-Datenbank. Jetzt habe ich zum kompilieren mit ICU-Unterstützung aktiviert (SQLITE_ENABLE_ICU
). Ich habe die neueste ICU Quelle.
Den configure
flags, die ich verwende:
./configure --target=arm-apple-darwin --enable-static --disable-shared
Danach läuft gnumake
ohne Fehler läuft.
Dann füge ich die Bibliotheken zu meinem Xcode Projekt. Aber wenn ich Baue, bekomme ich 50 Zeilen dieses:
Undefined symbols:
"_uregex_close_48", referenced from:
_icuRegexpDelete in libsqlite3-cerod.a(sqlite3_cerod.o)
"_ubrk_current_48", referenced from:
_icuNext in libsqlite3-cerod.a(sqlite3_cerod.o)
"_ucol_strcoll_48", referenced from:
_icuCollationColl in libsqlite3-cerod.a(sqlite3_cerod.o)
"_u_isspace_48", referenced from:
_icuRegexpFunc in libsqlite3-cerod.a(sqlite3_cerod.o)
"_utf8_countTrailBytes_48", referenced from:
_utf8_countTrailBytes_48$non_lazy_ptr in libsqlite3-cerod.a(sqlite3_cerod.o)
(maybe you meant: _utf8_countTrailBytes_48$non_lazy_ptr)
"_ubrk_next_48", referenced from:
_icuNext in libsqlite3-cerod.a(sqlite3_cerod.o)
Irgendeine Idee, was ich falsch mache?
Bearbeitet, um hinzufügen:
Wenn ich die Bibliotheken des Projektes (mit der rechten Maustaste auf den Namen des Projekts, Fügen Sie dann Vorhandene...), bekomme ich diese:
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicudata.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicui18n.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicuio.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicule.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libiculx.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicutu.a, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/eric.grunin/dev/iOS/icu/source/lib/libicuuc.a, file was built for unsupported file format which is not the architecture being linked (i386)
Das ist, warum ich glaube, ich Baue die Bibliothek falsch. Es ist, als ob es sagt:
- Es können nicht sagen, was die Architektur der .die Dateien sind gebaut für
- libsqlite3-cerod.einer ist gebaut für i386
Verstehe ich nicht, entweder die Möglichkeit, aber ich bin neu in der iPhone-Entwicklung.
Bearbeitet, um hinzufügen
Versuchte ich @Sergio Moura Lösung, und habe die genannten Fehler in meinem Kommentar.
Versuchte ich @sergio-Lösung, die gebaut. Aber ich bin noch immer der äquivalente Fehler, beginnend mit:
ld: warning: in /Users/eric.grunin/dev/iOS/icu/iosbuild/lib/libicudata.a, file was built for unsupported file format which is not the architecture being linked (i386)
Könnte ich sagen, Xcode, die falsche Sache? Ich bin der rechten Maustaste auf den Projektnamen, wählen Sie dann "Hinzufügen->Vorhandene Datei", und wählen Sie die sechs oder sieben .a
Dateien aus /icu/iosbuild/lib
. Ist das der richtige Prozess?
Hinweis:
@sergio empfiehlt configure --host=arm-apple-darwin
, @Sergio Moura ist mit configure --target=arm-apple-darwin
. Weder einen Unterschied gemacht, leider.
Edit #2
Targeting-Gerät aus (anstelle der emulator) alle Problem gelöst, aber eine der link-Fehler! Hier ist, was übrig bleibt:
Undefined symbols for architecture armv6:
"___sync_synchronize", referenced from:
_ucol_initUCA_48 in libicui18n.a(ucol_res.ao)
udata_getHashTable() in libicuuc.a(udata.ao)
_umtx_init_48 in libicuuc.a(umutex.ao)
_initCache in libicuuc.a(uresbund.ao)
icu_48::hasService() in libicui18n.a(coll.ao)
_ucol_initInverseUCA_48 in libicui18n.a(ucol_bld.ao)
icu_48::locale_set_default_internal(char const*)in libicuuc.a(locid.ao)
...
ld: symbol(s) not found for architecture armv6
Vorausgegangen war eine Kaskade von diesen Warnungen:
ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated: /Users/eric.grunin/dev/iOS/icu/iosbuild/lib/libicuuc.a(resbund.ao)
ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated: /Users/eric.grunin/dev/iOS/icu/iosbuild/lib/libicuuc.a(ustrfmt.ao)
Edit #3
@Stephen R. Loomis, die Anregung, die ich ändern #define U_HAVE_GCC_ATOMICS
aus 1
zu 0
(in platform.h
) kein Unterschied gemacht, leider. Ich habe auch gemerkt, dass die Letzte Zeile des Fehlers (not found for architecture arm6
) nicht bedeuten, es würde für arm7
war es nur ein fyi, dass dies war eine cross-kompilieren. Wenn ich ein arm7
bauen, scheiterte es mit den gleichen Meldungen. Ach.
Edit #4
Erfolg!
Inhaltsangabe: @sergio build flags im wesentlichen korrekt waren. Ich Hinzugefügt -DU_HAVE_GCC_ATOMICS=0, um die ios-build ist CFLAGS. Das einzige, was ich getan hatte, falsch war, nicht ahnend, dass ich brauchte, um cross-kompilieren der Bibliothek zu erstellen, ein Gerät zu bauen.
Ich habe nicht versucht, Sie zu wiederholen dies für den simulator, aber das ist außerhalb des Bereichs meiner Frage.
Besonderen Dank an Steven R. Loomis für pitching, und Sergio Moura für immer die Dinge ins Rollen.
- Sind Sie verknüpfen in der Intensivstation statische Bibliothek?
- Eric, keine Probleme mit Apple auf diese Lösung?
- Keine Probleme mit Apple, wir lieferten im Dezember ohne Zwischenfälle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT:
Kann ich bestätigen, dass, wenn Sie das tun, wie Steven R. Loomis schlägt vor:
set U_HAVE_GCC_ATOMICS 0 in icu/source/common/unicode/Plattform.h
make distclean
sh cross_configure.sh (mit meinem Skript, d.h., wenn Sie es verwenden)
sollte das problem behoben sein. In der Tat, ohne dies zu tun, die integrierten Bibliotheken enthalten die beanstandeten undefined symbol:
Nachdem die oben genannten Vorschlag, das ist das Ergebnis für den gleichen Befehl:
So, auf jeden Fall, wird der säumige symbol nicht vorhanden ist, in den binaries.
ENDE BEARBEITEN.
Cross-compiling libicu für iOS erfordert zwei separate Schritte:
kompilieren libicu für Ihren Rechner (MacOS) in einem build-Verzeichnis;
cross-compiling libicu für iOS, indem auch die Angabe der cross-compile-Verzeichnis.
Der Grund, warum Schritt 1 ist es erforderlich, dass libicu wird bootstrap, selbst ein wenig, d.h., er wird kompilieren, einige intermediate-tools, die werden dann in den rest des build-Prozesses; die tools müssen ran an die host-Plattform, so dass Sie zur Verfügung stehen.
Gut, alles in allem, können Sie die Schritte (1. kompilieren für den host):
Sobald dies geschehen ist, ist es Zeit, um cross-kompilieren (2. kompilieren für iOS):
Wo
cross_configure_icu.sh
ist ein shell-Skript, ähnlich den Vorschlägen von Sergio Moura oben, aber speziell für libicu und die Verwendung von mehr fortgeschrittene llvm-compiler:Im obigen script (Quelle),
ICU_PATH
ist ein absoluter Pfad, da libicu konfigurieren, so benötigt für diewith-cross-build
option. Wieder, überprüfen Sie Ihre Werte für die SDK und Compiler, aber das sollte ok sein für 4.3.Schließlich sollten Sie berücksichtigen, dass Apple (die Hälfte) wies mindestens eine app, die verbunden war gegen libicu, weil es ein reserviertes APIs. Haben Sie einen Blick auf diese S. O. Thema.
EDIT:
glücklich zu hören, dass Sie kompilieren könnte!
nun auf die Verknüpfung problem.
zuerst von allen, überprüfen Sie bitte, dass die libicu-Bibliotheken sind im richtigen format:
ausgegeben werden sollen (für jeden der libs):
Wenn diese in Ordnung ist, dann nächste Frage: sind Sie Gebäude für den simulator, oder für das Gerät? simulator braucht i386-Bibliotheken, device-arm-Bibliotheken... von der Fehlermeldung zeigen Sie:
scheint es mir, dass Ihr Gebäude gegen den simulator... dafür brauchst du "normale" macos x libs...
export CPP="$DEVROOT/usr/llvm-gcc-4.2/bin/llvm-cpp-4.2 $CPPFLAGS"
. Vielen Dank für all die Informationen.Ich verwendet, iOS SDK, version 6.1, mit clang und Gebäude gegen den c++11 standard-Bibliothek. Ich fand, dass das setzen von environment-Variablen wie CXXFLAGS hatte keine Wirkung, und zu versuchen, Sie zu übergeben, um Sie auf 'konfigurieren' auf der Kommandozeile schien zu brechen und es völlig. Ich endete damit, ein clang, clang++ und ld-Skripts, die erlauben würde, mich zu übergeben zusätzliche Parameter. Zum Beispiel, mein klappern-Skript:
Die anderen sind identisch, aber ersetzen clang++ und ld, wo angemessen, und verwenden Sie MORE_CXXFLAGS und MORE_LDFLAGS bzw.
Schließlich habe ich dieses script, was macht ein host bauen, einen simulator aufbauen, und einen iOS-build. Beachten Sie, dass der simulator bauen mit debug-info, und der iOS-version ist mit -O2 optimiert. Es dann lipos die libs (ist ein universal binary) und kopiert Sie zusammen mit den include-Ordner zu einem Ziel angegebene INSTALLATIONSPFAD. Zeilen 3-5 werden verwendet, um zu konfigurieren Sie das Skript. Alle 4 dieser Skripte die im gleichen Verzeichnis, und führen Sie dieses Letzte von der Befehlszeile aus:
Wenn Sie die Quelle haben, tun Sie wirklich brauchen, um die Verbindung der Bibliothek? Fügen Sie einfach die Quellen, um Ihre XCode-Projekt, und Sie sollten gut zu gehen...
Wenn Sie wirklich wollen, eine Bibliothek zu errichten, würde ich vorschlagen, Sie erstellen ein XCode Projekt für die Bibliothek mit dem iPhone als Ihr Ziel und link-Bibliothek, um Ihren code, wie Ihre Bibliothek wurde in Ihre MacOS-computer (je nach Fehler-Protokolle).
BEARBEITEN
Bauen es von der Befehlszeile aus, und vorausgesetzt, Sie sind nicht mit iOS 5 (weil Ihre version von XCode) habe ich ausgeliehen und angepasst dieser Satz von Anweisungen, um richtig setup die flags zu konfigurieren und zu bauen, richtig die Binärdateien für Ihre Plattform aus hier:
Bitte, richtig eingestellt die IOS-version auf die ersten beiden Anweisungen, um den richtigen Wert Ihrer Umgebung.
Wenn du gehst zu verwenden iOS 5 SDK, müssen Sie ändern Sie den Namen der compiler-Binärdateien, da Sie geändert haben.
sh /icu/source/configure --host=arm-apple-darwin --with-cross-build=/buildA --enable-static --disable-shared
?icu/source/common/putil.c:661:20: error: tzfile.h: No such file or directory
- gehen zu versuchen, den anderen @sergio jetzt...re: sync synchronisieren: kann jemand Lügen über die atomics oder es gibt einige gcc-Bibliothek benötigt. versuchen
#define U_HAVE_GCC_ATOMICS 0
an der Spitze der Intensivstation/source/common/unicode/uconfig.h ( Hinweis: der ARM scheint zu haben ein schwaches Gedächtnis-Modell, so dass diese änderung wird dazu führen, dass mehr sperren/entsperren, als es sonst notwendig sein, aber immer noch sicher. )