web-dev-qa-db-fra.com

Ignorer les bibliothèques incompatibles lors de la compilation

Lorsque j'essaye de compiler une copie de mon projet sur ma machine locale, j'obtiens une erreur indiquant qu'elle saute les bibliothèques incompatibles. Ce n'est pas le cas quand je déconne avec la version live hébergée sur le serveur au travail [ça fait parfaitement là].

Divers autres sites m'ont amené à penser que cela pourrait être un problème d'environnement, car je développe sur une distribution 64 bits d'Ubuntu et je suppose que la version du serveur fonctionne sur 32 bits. Néanmoins, après avoir défini mes variables d'environnement sur:

CFLAGS+=" -m32"
CXXFLAGS+=" -m32"

Je reçois toujours la même erreur de compilation:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http

Peut tutoriel Haz?

== Modifier ==

Ce fut la sortie que j'ai reçue quand j'ai suivi les conseils de Jonathan:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Apparemment, la bibliothèque en question est après tout de 32 bits?

31
kelly.dunn

Ce message n'est pas en fait une erreur - c'est juste un avertissement que le fichier en question n'est pas de la bonne architecture (par exemple 32 bits vs 64 bits, mauvaise architecture CPU). L'éditeur de liens continuera à chercher une bibliothèque du bon type.

Bien sûr, si vous obtenez également une erreur du type can't find lPI-Http alors vous avez un problème :-)

Il est difficile de suggérer quel sera le remède exact sans connaître les détails de votre système de construction et de vos makefiles, mais voici quelques plans dans le noir:

  1. Juste pour vérifier: en général, vous ajouteriez des drapeaux à CFLAGS plutôt qu'à CTAGS - êtes-vous sûr que c'est correct? (Ce que vous avez peut être correct - cela dépendra de votre système de construction!)
  2. Souvent, l'indicateur doit également être transmis à l'éditeur de liens - vous devrez peut-être également modifier LDFLAGS

Si cela ne vous aide pas - pouvez-vous publier la sortie d'erreur complète, plus la commande réelle (par exemple gcc foo.c -m32 -Dxxx etc) qui était en cours d'exécution?

32
psmears

Normalement, ce n'est pas une erreur en soi; c'est un avertissement que le premier fichier trouvé qui correspond à l'argument -lPI-Http au compilateur/éditeur de liens n'est pas valide. L'erreur se produit lorsqu'aucune autre bibliothèque ne peut être trouvée avec le bon contenu.

Donc, vous devez voir si /dvlpmnt/libPI-Http.a Est une bibliothèque de fichiers objets 32 bits ou de fichiers objets 64 bits - ce sera probablement 64 bits si vous compilez avec -m32. Ensuite, vous devez déterminer s'il existe un autre fichier libPI-Http.a Ou libPI-Http.so Ailleurs en 32 bits. Si tel est le cas, assurez-vous que le répertoire qui le contient est répertorié dans un argument -L/some/where À l'éditeur de liens. Sinon, vous devrez obtenir ou créer une version 32 bits de la bibliothèque quelque part.

Pour établir ce qui se trouve dans cette bibliothèque, vous devrez peut-être:

mkdir junk
cd junk
ar x /dvlpmnt/libPI-Http.a
file *.o
cd ..
rm -fr junk

L'étape 'file' vous indique le type de fichiers objets dans l'archive. Le reste s'assure simplement que vous ne faites pas de dégâts qui ne peuvent pas être facilement nettoyés.

11
Jonathan Leffler