Связывание статической версии библиотеки вместо динамической - PullRequest
4 голосов
/ 22 сентября 2011

Я пытаюсь использовать libjpeg в моем приложении. Создание проекта дает libjpeg.a в папке .libs. То, что я хотел бы сделать, это использовать этот файл на этапе связывания. Я пробовал следующее: я скопировал libjpeg.a в папку, где находится мой код C. Попытка связать с

gcc libjpeg.a mycode.c -o executable_name

выходит из строя. Если я сделаю gcc -ljpeg mycode.c, компиляция будет успешной, когда я изменю свой заголовок, чтобы он указывал вместо «libjpeg.h», но это, очевидно, связано с общесистемной динамической версией библиотеки.

Попытка связать с относительным или абсолютным путем также не удалась:

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

Я также попробовал статический параметр:

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

Ошибка компоновщика:

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

Вы можете скачать простой проект с Makefile здесь .

Ответы [ 3 ]

5 голосов
/ 22 сентября 2011

Вам нужно будет указать полный путь к libjpeg.a, если у вас есть libjpeg.a в папке .libs относительно того, где вы компилируете:

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

Если ваш специальный libjpeg.a находится где-то еще, укажите полный путь к нему.

Если это не поможет, вы должны сообщить нам, что происходит. (детали важны, поэтому, пожалуйста, скопируйте и вставьте точные ошибки и точную командную строку, которая запускается).

1 голос
/ 22 сентября 2011

Вам необходимо использовать -static:

gcc -static -o exec_name mycode.c -ljpeg

Нет необходимости копировать архив (.a).Вы могли бы узнать это, прочитав man ld.

0 голосов
/ 13 августа 2016

Это может помочь вам, если у вас такая же проблема, как у меня. В моей системе у меня есть

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

После того, как я добавил символическую ссылку:

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

Моя проблема была решена.

...