2011-09-22 2 views
4

J'essaie d'utiliser libjpeg dans mon application. Faire le projet donne un dossier libjpeg.a dans .libs. Ce que je voudrais faire est d'utiliser ce fichier dans la phase de liaison. J'ai essayé le suivant: J'ai copié le libjpeg.a dans le dossier où mon code de C réside. Essayer de lier avecLiaison de la version statique d'une bibliothèque au lieu de la version dynamique

gcc libjpeg.a mycode.c -o executable_name 

échoue. Si je fais gcc -ljpeg mycode.c, la compilation est réussie quand je change mon en-tête pour pointer à la place de "libjpeg.h", mais ceci est évidemment lié à la version dynamique de la bibliothèque.

Essayer de créer un lien avec un chemin relatif ou absolu échoue aussi:

gcc ./libjpeg.a mycode.c -o executable_name 

J'ai essayé l'option statique ainsi:

gcc -static libjpeg.a mycode.c -o executable_name 

L'erreur de liaison est la suivante:

Linking... 
gcc -std=c99 -Wall -Wextra -g -pedantic ./libjpeg.a ./libjpeg.a -lm obj/read_jpeg.o obj/utils.o -o test_jpeg 
obj/read_jpeg.o: In function `read_JPEG_file': 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:37: undefined reference to `jpeg_std_error' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:45: undefined reference to `jpeg_CreateDecompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:46: undefined reference to `jpeg_stdio_src' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:47: undefined reference to `jpeg_read_header' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:48: undefined reference to `jpeg_start_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:62: undefined reference to `jpeg_read_scanlines' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:74: undefined reference to `jpeg_finish_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:75: undefined reference to `jpeg_destroy_decompress' 
obj/read_jpeg.o: In function `read_JPEG_file_props': 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:93: undefined reference to `jpeg_std_error' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:100: undefined reference to `jpeg_CreateDecompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:101: undefined reference to `jpeg_stdio_src' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:102: undefined reference to `jpeg_read_header' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:103: undefined reference to `jpeg_start_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:113: undefined reference to `jpeg_read_scanlines' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:116: undefined reference to `jpeg_finish_decompress' 
/home/ustun/Downloads/jpeg_test/read_jpeg.c:117: undefined reference to `jpeg_destroy_decompress' 
collect2: ld returned 1 exit status 
make: *** [test_jpeg] Error 1 

Vous pouvez télécharger un projet simple avec un Makefile here.

Répondre

5

Il faudrait donner le chemin complet libjpeg.a, Si vous avez libjpeg.a dans un dossier .libs par rapport à l'endroit où vous compilez:

gcc mycode.c -o executable_name .libs/libjpeg.a 

Si votre libjpeg.a spécial est ailleurs, donner un chemin complet vers lui.

Si cela échoue, vous devez nous dire ce qui se passe. (les détails sont importants, donc s'il vous plaît copiez coller les erreurs exactes et la ligne de commande exacte qui est exécutée).

+0

Merci. Cela semble être la bonne voie, mais je reçois encore des erreurs de liaison. Libjpeg crée également un fichier .la, peut-être que j'ai besoin de faire un lien avec ça aussi? – ustun

+0

Je pense que cela l'a fait en fait! La bibliothèque doit venir à la fin. Je vais regarder de nouveau et accepter cela probablement. – ustun

+1

Je suis d'accord avec nos réponses.Souvenez-vous pour le futur que les arguments du linker sont très sensibles à l'ordre de leur appel (en général: les objets ne peuvent trouver que les fonctions vers lesquelles ils sont liés vers la droite d'une ligne de linkers, jamais vers la gauche). Lorsque des objets .la sont dans le jeu, ce sont des objets libtool, et vous pouvez utiliser libtool pour les lier ou trouver les objets réels dans .libs. – thiton

1

Vous devez utiliser -static:

gcc -static -o exec_name mycode.c -ljpeg 

Pas besoin de copier l'archive (.a). Vous auriez pu découvrir en lisant l'homme ld.

+0

J'essaye de lier à ma version spécifique de libjpeg.a, pas à celle du système. – ustun

+0

Ensuite, vous devrez nous donner l'erreur de l'éditeur de liens avec lequel votre approche échoue. – thiton

+0

Merci, j'ai inclus l'erreur de l'éditeur de liens, mais il ne semble pas en dire beaucoup. J'ai inclus un exemple de projet si vous souhaitez jeter un coup d'oeil. Merci. – ustun

0

Cela peut vous aider si vous avez le même problème que le mien. Dans mon système, je

libjpeg.so.62 -> libjpeg.so.62.0.0 libjpeg.so.62.0.0

Après avoir ajouté un lien symbolique:

ln -s sudo libjpeg.so.62 libjpeg.so

Mon problème a été résolu.

Questions connexes