Autoconf - включая статическую библиотеку (новичок)

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

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

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

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

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

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

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

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

Я попытался добавить местоположение, содержащее файл .a в 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 и включите .a прямо в 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"])

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

================ UPDATE

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

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

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

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

myprog_LDADD=($location)helper.a

================ UPDATE

Думаю, я это понял, но, поскольку я понятия не имею, что я делаю, я бы ДЕЙСТВИТЕЛЬНО оценил некоторые отзывы. Я использовал AC_SUBST(), чтобы myprog_LDADD работал с 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

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

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

AC_SUBST определяет переменную $LOCATION во всех ваших Makefile.am, а также заменяет все вхождения @[email protected] содержимым $LOCATION. Итак, в Makefile.am вы можете сделать

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

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