С помощью автонастройки, включая статическую библиотеку (новичок)


Я пытаюсь перенести свое приложение с ручной сборки на autoconf, который пока работает очень хорошо. Но у меня есть одна статическая библиотека, которую я не могу понять, как интегрировать. Эта библиотека не будет расположена в обычных местах расположения библиотеки-в месте расположения двоичного файла (.файл) и заголовок (.H file) будет задан в качестве аргумента configure. (Примечательно, что даже если я переставлю .файл в /usr / lib или в любое другое место, которое я могу придумать, все равно не будет работать.) Он также не назван традиционно (это не начинается с " lib " или "l").

Ручная компиляция работает с этими (каталог не предсказуем - это только пример):

gcc ...  -I/home/john/mystuff  /home/john/mystuff/helper.a

(э-э, я на самом деле не понимаю, почему.на файл ссылаются напрямую, а не через-L или что-то еще. Да, у меня есть неполное понимание построения программ на языке Си.)

Итак, в моем configure.ac, я могу использовать соответствующий аргумент configure, чтобы успешно найти заголовок (.H file) с помощью AC_CHECK_HEADER. Внутри AC_CHECK_HEADER Затем я добавляю расположение в CPFLAGS, и #include заголовочного файла в фактическом коде C отлично его подбирает.

Задается аргумент configure, который был помещен в $location, и имя необходимых файлов-helper.h и помощник.a (которые находятся в одном каталоге), вот что работает до сих пор:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"])

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

Я попытался добавить расположение, которое содержит .файл в LDFLAGS, а затем делает AC_CHECK_LIB, но он не найден.

Может быть, мой синтаксис неверен, или, может быть, я упускаю что-то более фундаментальное, чего не было бы удивительно, ведь я новичок и не очень понимаю, что делаю.

Вот что я попробовал:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location"; 
    AC_CHECK_LIB(helper)])

Никаких костей. AC_CHECK_LIB ищет-lhelper я думаю (или libhelper?) так что я не уверен, что это проблема, поэтому я попробовал это тоже (опустить AC_CHECK_LIB и включить .а прямо в LDFLAGS), без везения:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location/helper.a"])

Чтобы эмулировать ручную компиляцию, я попытался удалить-L, но это не помогло:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS $location/helper.a"])

Я пробовал другие комбинации и перестановки, но я думаю, я упускаю что-то более фундаментальное....

================ обновление

Я получил его для работы с жестко закодированным путем .файл внутри Makefile.am использование _LDADD следующим образом:

myprog_LDADD=/home/john/mystuff/helper.a

Но я не могу предсказать местоположение .файл. По какой-то причине определение myprog_LDADD в configure.ac не работает (я бы хотел, чтобы это было так, чтобы я мог использовать свою динамическую переменную местоположения), и никакая комбинация изменений LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS, кажется, не работает.

Если, в Makefile.am, я пытаюсь использовать переменную location, которая определена в configure.ac, это не работает

myprog_LDADD=($location)helper.a

================ обновление

Я думаю, что понял это, но так как я понятия не имею, что я делаю, я был бы очень признателен за обратную связь. Я использовал AC_SUBST (), чтобы заставить myprog_ldad работать из configure.ac, поэтому окончательное решение выглядит следующим образом:
AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location" 
    myprog_LDADD="$location/helper.a" 
    AC_SUBST(myprog_LDADD)])
1 14

1 ответ:

Вы можете задать местоположение в configure.ac:

LOCATION=/home/john/mystuff
AC_SUBST(LOCATION)

AC_SUBST определяет переменную $LOCATION во всех ваших Makefile.ams, а также заменяет все вхождения @LOCATION@ содержимым $LOCATION. Так что тогда в вашем Makefile.am Вы можете сделать

myprog_CPPFLAGS="-I$LOCATION"
myprog_LDADD="$LOCATION/helper.a"

ПС. Причина, по которой вы должны ссылаться на библиотеку напрямую, заключается в том, что -l ищет правильно названную библиотеку (например, libhelper.a) в каталогах системных библиотек. Однако, поскольку между статической библиотекой и объектным файлом не так уж много различий, нет необходимости магически ссылаться на него с помощью -l; вы можете просто скомпилировать его в свою программу, как вы делаете это сейчас.