2010-06-25 8 views
25

Lorsque j'essaie de compiler une copie de mon projet sur mon ordinateur local, une erreur s'affiche, indiquant qu'il ignore les bibliothèques incompatibles. Ce n'est pas le cas quand je suis en train de déconner avec la version live hébergée sur le serveur au travail [ça fait parfaitement partie]. 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 réglé mes variables d'environnement:Ignorer les bibliothèques incompatibles lors de la compilation

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

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

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

Peut-haz tutoriel?

== Modifier ==

Ce fut la sortie que j'ai reçu quand je suivais 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 de 32 bits après tout?

+1

Cette bibliothèque est-elle définitivement 32 bits? Essayez 'file/dvlpmnt/libPI-Http.a' – Rup

+0

@Rup: c'est probablement dire 'current ar archive', ce qui n'est pas terriblement utile. Vous devez trouver un fichier dans l'archive, comme indiqué dans ma réponse. –

+0

Veuillez poster la ligne de commande de l'éditeur de liens ... vous avez raison, il semble que la bibliothèque soit en 32 bits, mais peut-être que l'éditeur de liens recherche des bibliothèques 64 bits malgré ce que vous pensiez avoir fait. –

Répondre

28

Ce message n'est pas réellement 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 du processeur). L'éditeur de liens continuera à chercher une bibliothèque du bon type.

Bien sûr, si vous obtenez également une erreur le long des lignes de can't find lPI-Http alors vous avez un problème :-)

Il est difficile de suggérer ce que le remède exact sera sans connaître les détails de votre système de construction et makefiles, mais voici quelques coups de feu dans l'obscurité:

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

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

+1

Je suis désolé, vous avez raison. J'ai utilisé CFLAGS au lieu de CTAGS: P –

+0

En plus de cette solution, vous pouvez ajouter '-Wl, - no-warn-search-mismatch' à votre' CFLAGS', donc ces avertissements sont supprimés. –

9

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 vérifier si /dvlpmnt/libPI-Http.a est une bibliothèque de fichiers objets 32 bits ou de fichiers objets 64 bits - il sera probablement 64 bits si vous compilez avec l'option -m32. Ensuite, vous devez déterminer s'il existe un autre fichier libPI-Http.a ou libPI-Http.so à un autre emplacement 32 bits. Si c'est le cas, vérifiez que le répertoire qui le contient est répertorié dans un argument -L/some/where de l'éditeur de liens. Si ce n'est pas le cas, vous devrez obtenir ou créer une version 32 bits de la bibliothèque à partir de quelque part.

Pour établir ce qui est dans cette bibliothèque, vous devez faire:

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

L'étape « file » vous indique quel type de fichiers objet sont dans l'archive. Le reste fait juste en sorte que vous ne fassiez pas un gâchis qui ne peut pas être facilement nettoyé.

+1

Huh, c'est bizarre, cette étape me montre maintenant que toutes les bibliothèques en question sont, en fait, 32 bits. o__o –

+1

@defaultstring: Quelle est la ligne de commande de liaison actuelle? Inclut-il le drapeau '-m32'? Ajouter cela comme information supplémentaire dans la question, plutôt que comme un commentaire supplémentaire ici, s'il vous plaît. –