Я пытаюсь перенести мое приложение из ручной сборки в 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)])