Я пытаюсь переместить свое приложение от ручной сборки до autoconf, который работает очень приятно до сих пор. Но у меня есть одна статическая библиотека, которую я не могу выяснить, как интегрироваться. Та библиотека НЕ будет расположена в обычных местоположениях библиотеки - местоположение двоичного файла (.a файл) и заголовок (.h файл) будет дано как настраивать аргумент. (В частности, даже если я перемещу.a файл в/usr/lib, или где-либо еще я могу думать, то он все еще не будет работать.) Это также не называют традиционно (это не запускается с "lib" или "l").
Ручная компиляция работает с ними (каталог не предсказуем - это - просто пример):
gcc ... -I/home/john/mystuff /home/john/mystuff/helper.a
(Мм, я на самом деле не понимаю, почему на.a файл ссылаются непосредственно, не с-L или чем-либо. Да, у меня есть непродуманное понимание создания C программы.)
Так, в моем configure.ac я могу использовать соответствующее, настраивают аргумент для успешного нахождения заголовка (.h файл) использующий AC_CHECK_HEADER. В AC_CHECK_HEADER я затем добавляю местоположение к CPFLAGS, и #include заголовочного файла в фактическом коде C берет его приятно.
Данный настраивать аргумент, который был помещен в $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 я пытаюсь использовать переменное местоположение, которое определяется в 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)])
Вы можете установить местоположение в configure.ac
:
LOCATION=/home/john/mystuff
AC_SUBST(LOCATION)
AC_SUBST
определяет переменную $ LOCATION
во всех ваших файлах Makefile.am
, а также заменяет все вхождения @ LOCATION @
содержимым $ LOCATION
. Итак, в вашем Makefile.am
вы можете сделать
myprog_CPPFLAGS="-I$LOCATION"
myprog_LDADD="$LOCATION/helper.a"
PS. Причина, по которой вам нужно ссылаться на библиотеку напрямую, заключается в том, что -l
ищет библиотеку с правильным именем (например, libhelper.a
) в каталогах системных библиотек. Однако, поскольку нет большой разницы между статической библиотекой и объектным файлом, нет необходимости волшебным образом ссылаться на нее с помощью -l
; вы можете просто скомпилировать его в свою программу, как вы это делаете сейчас.