Cross-kompilieren libgcrypt für das iPhone? Linker-Fehler ... kann nicht scheinen, „Fwrite“ und „strerror“ zu finden?
-
06-07-2019 - |
Frage
Ich habe erfolgreich Quer kompiliert, um die Apache Portable Runtime (APR) für das iPhone , eine Reihe von Skripte konfigurieren dass die GNU Autotools aufrufen" configure“mit dem notwendig Querübersetzbarkeit Optionen.
ich jetzt bin versucht, Quer kompilieren GNUTLS, die auf libtasn1 und auf libgcrypt abhängt, die wiederum hängt von libgpg-Fehler. Dies ist, wo ich in Schwierigkeiten bin mit und Ihre Hilfe gebrauchen könnte ...
Ich bin derzeit versucht, Cross-kompilieren libgpg-Fehler. Der configure-Skripte, die ich verwenden, bevor arbeitet schön; die „Configure“ Prozess abgeschlossen ist sauber. Die Probleme treten auf, wenn ich „make“ laufen. Wenn ich laufen zu lassen, scheint alles zu kompilieren, aber dann bekomme ich folgende fiese Linker-Fehler am Ende:
/bin/sh ../libtool --tag=CC --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o ./libgpg-error.la /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.a Undefined symbols: "_fwrite$UNIX2003", referenced from: _main in gpg_error-gpg-error.o "_strerror$UNIX2003", referenced from: _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o) ld: symbol(s) not found collect2: ld returned 1 exit status make[3]: *** [gpg-error] Error 1 make[2]: *** [all] Error 2 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2
Alle Ideen, wie dies zur Arbeit kommen? Die Versionen der Software, die ich kompiliert sind:
- libgpg-Fehler: 1.7
- libgcrypt: 1.4.4
- libtasn1: 2.2
- gnutls: 2.8.4
Bitte helfen. Danke.
Update
Wie pro erstem Feedback hat jedes SDK eine Kopie von "libSystem.dylib" in "$ SDKROOT / usr / lib". Es gibt keine Kopie von libSystem in "$ devRoot / usr / lib", wobei gilt:
- $ devRoot = "/Developer/Platforms/iPhoneOS.platform/Developer"
- $ SDKROOT = "$ devRoot / SDKs / iPhoneOS $ VER.sdk"
Die „libSystem“ Bibliotheken enthalten die gewöhnlichen, nicht ergänzten Versionen jedes Symbols, aber enthalten nicht die „$ UNIX2003“ Varianten der Symbole. Ich vermute, dass GPG-ERROR ist die Definition „_POSIX_C_SOURCE“, „_UNIX“ oder einen anderen Feature-Test-Makro UNIX, und dass ein vermeintliches Header, die „$ UNIX2003“ auf die Funktionen, wenn dieser Feature-Test-Makros vorhanden ist, wird enthalten ist, angehängt wird. Entfernen von „$ devRoot / usr / include“ aus der Liste der Include-Verzeichnisse keine Wirkung hinsichtlich hat, um diese Fehlermeldung zu entfernen.
Als letzten Ausweg, ich sehe, dass „ld“ akzeptiert eine „-alias_list“ Option, dass man eine Datei mit Einträgen wie „_fwrite _fwrite $ UNIX2003“ angeben kann, um diese gewaltsam undefinierten Symbole, um ihre undecorated Varianten zu lösen. Wenn möglich, möchte ich an dieser Option vermeiden, da es hackish und potenziell gefährlich scheint.
Lösung
In der Regel eine nicht aufgelöste Symbol $ UNIX2003 Mittel dass Sie Verknüpfung mit einem älteren SDK als das die vorhandenen Objektdateien gegen
Ein seltsame suchen umfassen Weg zu mir und bitte beachten Sie, dass ich nur vage vertraut mit Mac Entwicklung und nicht mit iPhone Entwicklung ist der Pfad
/Developer/Platforms/iPhoneOS.platform/Developer/usr/include
, die nicht tatsächlich in dem SDK-Ordner ist. Ist es möglich, dass Sie die Rogue-Symbole aufgenommen haben, wenn sie das sind, von dort? Es scheint unwahrscheinlich, da es später in der Befehlszeile auftritt als das SDK beinhalten Pfade.
Vielleicht stattdessen die Symbole sind die erwarteten Versionen von _fwrite
und _strerror
und so gpg_error-gpg-error.o
und libgpg-error.a
sind in Ordnung und es ist wirklich eine verbindende Frage, obwohl wieder unwahrscheinlich, da Sie haben
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib
als Option -L. Ich gehe davon aus, es gibt einen libSystem dylib dort irgendwo?
Ich denke, das erste, was zu tun ist, festzustellen, ob die UNIX2003 Version des Symbols ist das, was Sie erwarten, oder nicht. Meine Vermutung ist, es ist, aber wie ich sagen, dass ich völlig falsch sein könnte. :)
Zweitens könnten Sie versuchen, eine ausführliche Ausgabe von ld
bekommen, um zu sehen, wo es Symbole zu finden. Ich bin sicher, dass es eine Umgebungsvariable, die Sie festlegen können, damit dies geschieht, aber ich kann nicht in der Online-man-Seite für ld
aufgeführt. ( Aktualisieren : Die beiden env Variablen sind LD_TRACE_ARCHIVES
und LD_TRACE_DYLIBS
aber vielleicht geben sie die gleiche wie -t).
Edit:
OK, also war ich völlig falsch über die UNIX2003 Symbole diejenigen sind, die erforderlich waren. lol.
Wenn Sie libgpg-Fehler gebaut ich denke, es wird eine Datei erstellt hat
src / .deps / gpg_error-GPG-error.Po
, welche Header-Abhängigkeiten enthält (zumindest habe es auf meinem Linux-System). Dies könnte einen Anhaltspunkt geben, wo sie nahm den falschen Header, wenn gpg_error-GPG-error.o zu bauen.
BTW, es sieht aus, als ob der libgpg-Fehler Configure-Skript sowohl eine -isysroot
und -arch
options akzeptiert. Können Sie nicht die, statt Ihre eigene Version der Konfigurationsskript verwenden?
Edit2:
Okay, lassen Sie sich ein anderes mal ran :) Hier sind einige Dinge zu versuchen, von einem sauberen Quellordner starten:
- Verwendung -isysroot statt --sysroot
- verwenden -isysroot sowie --sysroot
- vorübergehend machen Ihr normales System durch nicht verfügbare Header zum Beispiel den Ordner umbenennen. Hoffentlich wird die Build-umfallen einen Header zu finden scheitern und es wird Ihnen sagen, wo genau.
Andere Tipps
Versuchen Sie, Vorprozess gpg_error-GPG-error.c mit -E dann die fehlenden Symbole suchen. Sie sollten von finden, wo es Inclued (so etwas wie asm ( „_“ „nett“ „@ UNIX2003“). Ändern Sie dann diesen Header (unistd.h zum Beispiel ein #WARNING „HIER“ hinzufügen). Jetzt neu kompilieren, und Sie sollten die Include-Stapel finden.
Das $ 2.003 Suffix wird vom Compiler unter Umständen erzeugt, die Sie finden können in der manuellen Eingabe vollständig dokumentiert für compat
man compat
ich mit diesem rang seit einiger Zeit, bevor sie schließlich Festsetzung indem
-mmacosx-version-min=10.3
Jede Version vor 10.4 wird die Arbeit machen. Ich vermute, dass Troubadour Antwort gegeben ich besser für irrtümlich verknüpften Bibliotheken sein kann mit der Option -t von ld Suche
Hope, das hilft.