2012-09-01 5 views
0

Je suis un C noob, donc c'est peut-être une question stupide. J'essaie de compiler un fichier .so (bibliothèque partagée, si ma terminologie est correcte) des objets C (fichiers .o), dans le but exprès de les importer en Python via ctypes. J'ai d'abord compilé le * .so avecImpossible de trouver -llibc

gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o 

Cela a fonctionné, sauf que lorsque j'ai essayé de charger via ctypes j'ai été récompensé avec:

OSError: ./libvARAM.so: undefined symbol: max 

Après quelques recherches, je me suis aperçu que max est pas une norme Fonction C Appeler ldd libvARAM.so m'a informé que l'une des dépendances est libc.so.6. J'ai créé un lien symbolique libc.so-libc.so.6 puis essayé de recompiler mon .donc comme

gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o -llibc 

qui a généré

/usr/bin/ld: cannot find -llibc 

La même erreur est générée si j'essaie aussi -L/lib/i386-linux-gnu/ -llibc. Je suis au courant de thread this, mais pense que ce n'est pas pertinent à ma situation, car la solution est là pour un fichier makefile. J'utilise Xubuntu si cela est important.

Toute aide est sincèrement appréciée!

+0

Lors de la compilation de certains logiciels GNU, la bibliothèque de portabilité incluse (compilée) est 'libiberty.a'. Ceci est inclus dans la compilation avec l'option '-liberty', bien sûr. (Triste qu'ils soustraient la liberté, mais c'est la convention pour les options, bien sûr.) –

Répondre

2

Un: Les indicateurs Linker ne fonctionnent pas comme ça. Pour libXYZ.so, l'indicateur de liaison correspondant n'est PAS -llibXYZ mais seulement -lXYZ. Deux: même cela n'est pas nécessaire, car la bibliothèque standard C (-lc) est automatiquement liée à l'exécutable.

Trois: votre problème plus probable est qu'il devrait y avoir une max()macro (par opposition à une fonction) définie dans l'un des fichiers d'en-tête, mais vous ne pas inclure ce fichier d'en-tête, de sorte que le compilateur n » Je sais que c'est une macro et la traite comme une fonction - alors, bien sûr, elle ne peut pas la trouver dans libc.so parce qu'elle n'est pas là.

+0

Est-il normal d'inclure des fichiers d'en-tête dans des fichiers .so? Je pensais que les fichiers d'en-tête étaient utilisés pour compiler des fichiers .c dans des fichiers .o. – learner

+0

@learner (facepalm tronqué) no. Pour compiler les fichiers c en fichiers o, vous utilisez un * complier *. ** compilateur! = fichier d'en-tête **. Deux, un n'inclut pas les fichiers d'en-tête dans le fichier .so, mais dans c ou d'autres fichiers h. –

+0

Pour clarifier - je voulais demander si les fichiers d'en-tête ont été utilisés dans la compilation de .c à .o. Vous avez raison - 'max' (et' min') sont définis comme des macros dans un fichier d'en-tête séparé. Cependant, ce fichier d'en-tête ** était ** inclus dans le processus de compilation. Vous ne savez pas vraiment quoi faire à ce stade ... – learner

0

l'affichage de cette façon que si d'autres newbies voient, ils voient la réponse ... Au fond, mon dossier d'en-tête est la suivante:

#ifdef UNIX 
#define min(x, y) (x<y ? x : y) 
#define max(x, y) (x<y ? y : x) 
#endif 

Retrait des première et dernière lignes (pas de contrôle ifdef) a permis au compilateur de lire ces définitions. Apparemment, il ne les avait pas lus.