Cross-kompilieren libgcrypt für das iPhone? Linker-Fehler ... kann nicht scheinen, „Fwrite“ und „strerror“ zu finden?

StackOverflow https://stackoverflow.com/questions/1620375

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.

War es hilfreich?

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 -archoptions 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.

scroll top