Я чрезвычайно плохо знаком с использованием Make-файлов и автоконференции. Я использую библиотеку изображений Камелии и пытаюсь статически связать свой код против их библиотек. Когда я работаю, "делают" на библиотеке изображений Камелии, я получаю libCamellia.a, .so, .la, и .so.0.0.0 файлы в моем/usr/local/lib каталоге. Это - команда, которую я использую для компиляции моего кода с их библиотеками:
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
Я хочу статически связаться, потому что я пытаюсь изменить исходный код Камелии, и я хочу сравнить свою версию с их. Таким образом, после некоторого поиска с помощью Google, я пытался добавить AM_DISABLE_SHARED в configure.in файл. Но после выполнения./настраивать, я все еще получаю тот же самый Make-файл. После того, как я "сделаю установку", я все еще получаю те же результаты выше.
Что простой способ состоит в том, чтобы получить две версии моего кода, один с исходным скомпилированным исходным кодом Камелии и один с моей измененной версией? Я думаю, что статические библиотеки должны работать. Существует простой способ получить статическую работу библиотек или там другие простые решения моей проблемы? Я просто не хочу пере - "делают", и пере - "делают установку", каждый раз я хочу сравнить свою версию с оригиналом.
Я не разбираюсь в autoconf и не знаю, почему ваша попытка статической компоновки терпит неудачу, но если компоновка работает динамически, я думаю, что использование разделяемых библиотек на самом деле Решите вашу проблему немного лучше.
Просто создайте две общие библиотеки, одну с исходным кодом Camellia, а другую с вашей модифицированной версией. Поместите их в два разных каталога, и когда вы запустите myprogram
, вы можете выбирать между ними, либо переключая LD_LIBRARY_PATH (или что-то еще, что вы используете для поиска библиотек), либо сохраняя символическую ссылку в / usr / local / lib
и переключение между библиотеками.Преимущество этого перед статическими библиотеками (помимо того факта, что это работает) заключается в том, что вы можете возиться со своим измененным кодом, перестраивать разделяемую библиотеку и запускать без необходимости перестраивать myprogram
(пока вы этого не сделаете) t изменить подписи).
P.S. Эксперимент: попробуйте удалить разделяемые библиотеки из / usr / local / lib
и перестроить без флага -static
, как если бы вы использовали разделяемые библиотеки. Теоретически это должно заставить gcc использовать вместо этого статические библиотеки. Результаты могут дать понять, почему статическая ссылка не работает.
Вы повторно запустили autoconf
после добавления AM_DISABLE_SHARED
и перед configure, make, make install? Вы также можете просто использовать configure --disable-dynamic
, чтобы остановить сборку разделяемых библиотек. Убедитесь, что вы удалили все ранее установленные - make uninstall
должен сделать это. Больше я не вижу ничего явно неправильного. Попробуйте быть явным:
gcc -static -o myprogram myprogram.c /usr/local/lib/libCamellia.a
или разбейте это на два шага и проверьте символы в myprogram.o
- это то, что вы ожидаете с помощью nm myprogram.o
.