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.
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
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
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