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)])