Compilation croisée de libgcrypt pour iPhone? Erreur de l'éditeur de liens & # 8230; Je n'arrive pas à trouver le mot & # 8220; fwrite & # 8221; et & # 8220; strerror & # 8221 ;?

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

Question

J'ai réussi compilé de manière croisée l’APache Portable Runtime (APR) pour iPhone , à l’aide d’un ensemble de configurez les scripts qui appellent les outils automatiques GNU" ./ configure ". avec les options nécessaires de compilation croisée.

J'essaie maintenant de compiler de manière croisée GNUTLS, qui dépend de libtasn1 et de libgcrypt, qui à son tour dépend de libgpg-error. C’est là que je rencontre des problèmes et que je pourrais utiliser votre aide ...

J'essaie actuellement de compiler de manière croisée libgpg-error. Les scripts de configuration que j'ai utilisés auparavant fonctionnent à merveille. le " ./ configure " processus se termine proprement. Les problèmes se produisent lorsque je lance "make". Quand je lance make, tout semble se compiler, mais je reçois à la fin l'erreur de l'éditeur de liens désagréable suivante:

/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

Des idées sur la façon de faire fonctionner cela? Les versions du logiciel que je compile sont les suivantes:

      
  • erreur-libgpg: 1.7
  •   
  • libgcrypt: 1.4.4
  •   
  • libtasn1: 2.2
  •   
  • petits morceaux: 2.8.4

S'il vous plaît aider. Merci.

Mettre à jour

Comme indiqué dans les premiers commentaires, chaque kit SDK contient une copie de "libSystem.dylib". dans "$ SDKROOT / usr / lib". Il n’existe aucune copie de libSystem dans "$ DEVROOT / usr / lib", où:

      
  • $ DEVROOT = " /Developer/Platforms/iPhoneOS.platform/Developer"
  •   
  • $ SDKROOT = " $ DEVROOT / SDKs / iPhoneOS $ VER.sdk "

Le " libSystem " Les bibliothèques contiennent les versions ordinaires, non décorées, de chaque symbole, mais ne contiennent pas le symbole "$ UNIX2003". variantes des symboles. Je soupçonne que GPG-ERROR définit "_POSIX_C_SOURCE", "_UNIX" ou une autre macro de test de fonctionnalité UNIX et qu'un en-tête non autorisé ajoute "$ UNIX2003". aux fonctions lorsque ces macros de test de fonctionnalités sont présentes est en cours d’inclusion. Suppression de " $ DEVROOT / usr / include " de la liste des répertoires include n'a aucun effet sur la suppression de ce message d'erreur.

En dernier recours, je vois que " ld " accepte une " -alias_list " option qui permet de spécifier un fichier avec des entrées telles que " _fwrite _fwrite $ UNIX2003 " résoudre de force ces symboles non définis à leurs variantes non décorées. Si possible, je voudrais éviter cette option, car elle semble bidon et potentiellement dangereuse.

Était-ce utile?

La solution

Il s'agit généralement d'un symbole $ UNIX2003 non résolu. que vous établisse une liaison avec un SDK plus ancien que celui sur lequel les fichiers objet existants ont été créés .

Un chemin assez étrange pour moi, et notez que je ne suis que vaguement familier avec le développement Mac et pas du tout avec le développement iPhone, c'est le chemin

/Developer/Platforms/iPhoneOS.platform/Developer/usr/include

qui ne se trouve pas réellement dans le dossier SDK. Est-il possible que vous ayez ramassé les symboles voyous, s'ils le sont, à partir de là? Cela semble peu probable, car il se produit plus tard dans la ligne de commande que les chemins d'accès inclus dans le SDK.

Peut-être que les symboles sont les versions attendues de _fwrite et de _strerror et ainsi de suite gpg_error-gpg-error.o et libgpg -error.a va bien et c'est vraiment un problème de lien, encore une fois peu probable que vous ayez

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib

en tant qu'option -L. Je suppose qu'il y a un dylib libSystem quelque part?

Je suppose que la première chose à faire est de vérifier si la version UNIX2003 du symbole correspond à ce que vous attendez ou non. Je suppose que oui, mais comme je l'ai dit, je peux me tromper complètement. :)

Deuxièmement, vous pouvez essayer d'obtenir une sortie commentée de ld pour voir où il trouve des symboles. Je suis sûr qu'il existe une variable d'environnement que vous pouvez définir pour que cela se produise, mais je ne vois aucune liste répertoriée dans la page de manuel en ligne pour ld . ( Mettre à jour : les deux variables env sont LD_TRACE_ARCHIVES et LD_TRACE_DYLIBS mais donnent peut-être la même chose que -t?).

Modifier:

OK, j’avais donc complètement tort de dire que les symboles UNIX2003 étaient ceux qui étaient nécessaires. lol.

Quand vous aurez construit libgpg-error, je pense qu'il aura créé un fichier

src / .deps / gpg_error-gpg-error.Po

qui contient des dépendances d’en-tête (du moins sur mon système Linux). Cela pourrait donner une idée de l'endroit où il a pris le mauvais en-tête lors de la construction de gpg_error-gpg-error.o.

BTW, il semble que le script de configuration libgpg-error accepte à la fois les options -isysroot et -arch . Ne pouvez-vous pas les utiliser à la place de votre propre version du script configure?

Modifier2:

D'accord, essayons encore :) Voici quelques choses à essayer, à partir d'un dossier source propre:

  • utilisez -isysroot au lieu de --sysroot
  • utilisez -isysroot ainsi que --sysroot
  • rendez temporairement vos en-têtes système normaux indisponibles, par exemple en renommant le dossier. Espérons que la construction échouera en ne trouvant pas d’en-tête et vous indiquant exactement où.

Autres conseils

Essayez de prétraiter gpg_error-gpg-error.c avec -E, puis recherchez les symboles manquants. Vous devriez trouver d'où il est inclus (quelque chose comme asm ("_" "gentil" "@ @ UNIX2003"). Modifiez ensuite cet en-tête (unistd.h, par exemple, pour ajouter un #warning "HERE"). Maintenant, recompilez et vous devriez trouver la pile d’inclusion.

Le suffixe $ 2003 est généré par le compilateur dans certaines circonstances parfaitement documentées dans la saisie manuelle de compat

man compat

J'ai lutté avec cela pendant un certain temps avant de le réparer en définissant

-mmacosx-version-min = 10.3

Toute version antérieure à 10.4 fera l'affaire. Je pense que vu la réponse de Troubadour, il vaudrait peut-être mieux chercher des bibliothèques liées par erreur en utilisant l'option -t de ld

J'espère que cela vous aidera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top