configure.in: AM_DISABLE_SHARED не изменяет мой Make-файл

Я чрезвычайно плохо знаком с использованием 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-файл. После того, как я "сделаю установку", я все еще получаю те же результаты выше.

Что простой способ состоит в том, чтобы получить две версии моего кода, один с исходным скомпилированным исходным кодом Камелии и один с моей измененной версией? Я думаю, что статические библиотеки должны работать. Существует простой способ получить статическую работу библиотек или там другие простые решения моей проблемы? Я просто не хочу пере - "делают", и пере - "делают установку", каждый раз я хочу сравнить свою версию с оригиналом.

1
задан artless noise 4 February 2016 в 14:18
поделиться

2 ответа

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

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

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

1
ответ дан 3 September 2019 в 00:31
поделиться

Вы повторно запустили 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.

1
ответ дан 3 September 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: