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

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

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

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

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

Итак, в моем файле 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 файла). Независимо от того, что я пытаюсь, я всегда получаю ошибку о неопределенных ссылках на вызовы функций для этой библиотеки. Я почти уверен, что это проблема связывания, потому что я могу возиться с кодом 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"])

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

================ ОБНОВЛЕНИЕ

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

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

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

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

myprog_LDADD=($location)helper.a

================ ОБНОВЛЕНИЕ

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

Ваш ответ на вопрос