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

Я пытаюсь переместить свое приложение от ручной сборки до 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)])
15
задан EBM 2 May 2010 в 19:23
поделиться

1 ответ

Вы можете установить местоположение в 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 ; вы можете просто скомпилировать его в свою программу, как вы это делаете сейчас.

10
ответ дан 1 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: