0

Я чрезвычайно новичок в использовании Makefile и autoconf. Я использую библиотеку изображений Camellia и пытаюсь статически связать свой код с их библиотеками. Когда я запускаю «make» в библиотеке изображений Camellia, я получаю файлы libCamellia.a, .so, .la и .so.0.0.0 внутри каталога/usr/local/lib. Это команда, которую я использовать для компиляции моего кода с их библиотеками:configure.in: AM_DISABLE_SHARED не меняет мой файл Makefile

gcc -L/usr/local/lib -lCamellia -o myprogram myprogram.c 

Это работает отлично, но когда я пытаюсь статически, это то, что я получаю:

gcc -static -L/usr/local/lib -lCamellia -o myprogram myprogram.c 
/tmp/cck0pw70.o: In function `main': 
myprogram.c:(.text+0x23): undefined reference to `camLoadPGM' 
myprogram.c:(.text+0x55): undefined reference to `camAllocateImage' 
myprogram.c:(.text+0x97): undefined reference to `camZoom2x' 
myprogram.c:(.text+0x104): undefined reference to `camSavePGM' 
collect2: ld returned 1 exit status 

Я хочу статически потому что я пытаюсь изменить исходный код Camellia, и я хочу сравнить свою версию с их версией. Поэтому после некоторых поисковых запросов я попытался добавить AM_DISABLE_SHARED в файл configure.in. Но после запуска ./configure, я все равно получаю то же самое Makefile. После того, как я «сделаю установку», я все равно получаю те же результаты выше.

Что такое простой способ получить две версии моего кода, один с исходным исходным кодом Camellia и один с моей модифицированной версией? Я думаю, что статические библиотеки должны работать. Есть простой способ заставить статические библиотеки работать или есть другие простые решения моей проблемы? Я просто не хочу повторно «делать» и «устанавливать установку» каждый раз, когда хочу сравнить свою версию с оригиналом.

ответ

1

Вы повторно запустили autoconf после добавления AM_DISABLE_SHARED и перед настройкой, make, make install? Вы также можете использовать configure --disable-dynamic, чтобы остановить создание общих библиотек. Удостоверьтесь, что вы удалили все ранее установленные - make uninstall должен это сделать. Я не вижу ничего другого, очевидно, неправильного. Попробуйте быть явным:

gcc -static -o myprogram myprogram.c /usr/local/lib/libCamellia.a 

или разбить его на два шага и проверить символы в myprogram.o то, что вы ожидаете с nm myprogram.o.

+2

Для пакетов, использующих libtool, это './configure --disable-shared', а не' --disable-dynamic'. –

1

Я не умею работать с autoconf, и я не знаю, почему ваша попытка связать статически не удается, но если динамическая работа по связыванию, я думаю, что использование разделяемых библиотек фактически решит вашу проблему немного лучше.

Просто создайте две разделяемые библиотеки, одну с оригинальным кодом Camellia и одну с модифицированной версией. Поместите их в две разные директории, и когда вы запустите myprogram, вы можете выбирать между ними либо путем переключения LD_LIBRARY_PATH (или того, что вы используете для поиска библиотек), либо путем сохранения символической ссылки в /usr/local/lib и переключения между библиотеками. Преимущество этого в статических библиотеках (помимо того, что это работает) заключается в том, что вы можете возиться с вашим измененным кодом, перестраивать разделяемую библиотеку и работать без необходимости перестраивать myprogram (пока вы не изменяете подписи).

P.S. Эксперимент: попробуйте удалить общие библиотеки с /usr/local/lib и перестроить без флага -static, как если бы вы использовали общие библиотеки. Теоретически это должно заставить gcc использовать статические библиотеки. Результаты могут дать понять, почему статическая ссылка не работает.

Смежные вопросы