configure.in: AM_DISABLE_SHARED не меняет мой Makefile - PullRequest
1 голос
/ 16 мая 2010

Я чрезвычайно новичок в использовании Makefiles и autoconf. Я использую библиотеку изображений Camellia и пытаюсь статически связать мой код с их библиотеками. Когда я запускаю «make» в библиотеке изображений Camellia, я получаю файлы 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

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

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

Ответы [ 2 ]

1 голос
/ 16 мая 2010

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

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

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

1 голос
/ 16 мая 2010

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

...