С помощью автонастройки, включая статическую библиотеку (новичок)
Я пытаюсь перенести свое приложение с ручной сборки на 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 ответ:
Вы можете задать местоположение в
configure.ac
:LOCATION=/home/john/mystuff AC_SUBST(LOCATION)
AC_SUBST
определяет переменную$LOCATION
во всех вашихMakefile.am
s, а также заменяет все вхождения@LOCATION@
содержимым$LOCATION
. Так что тогда в вашемMakefile.am
Вы можете сделатьmyprog_CPPFLAGS="-I$LOCATION" myprog_LDADD="$LOCATION/helper.a"
ПС. Причина, по которой вы должны ссылаться на библиотеку напрямую, заключается в том, что
-l
ищет правильно названную библиотеку (например,libhelper.a
) в каталогах системных библиотек. Однако, поскольку между статической библиотекой и объектным файлом не так уж много различий, нет необходимости магически ссылаться на него с помощью-l
; вы можете просто скомпилировать его в свою программу, как вы делаете это сейчас.