Autoconf - incluindo uma biblioteca estática (novato)

Estou tentando migrar meu aplicativo da compilação manual para o autoconf, que está funcionando muito bem até agora. Mas eu tenho uma biblioteca estática que não consigo descobrir como integrar. Essa biblioteca NÃO estará localizada nos locais habituais da biblioteca - o local do binário (arquivo .a) e do cabeçalho (arquivo .h) será fornecido como um argumento de configuração. (Notavelmente, mesmo que eu mova o arquivo .a para / usr / lib ou em qualquer outro lugar em que possa pensar, ele ainda não funcionará.) Também não é nomeado tradicionalmente (ele não começa com "lib" ou "l ").

A compilação manual está funcionando com eles (o diretório não é previsível - este é apenas um exemplo):

gcc ...  -I/home/john/mystuff  /home/john/mystuff/helper.a

(Na verdade, eu não entendo por que o arquivo .a é referenciado diretamente, não com -L ou algo assim. Sim, eu tenho um entendimento incompleto da criação de programas em C.)

Portanto, no meu configure.ac, posso usar o argumento de configuração relevante para encontrar com êxito o cabeçalho (arquivo .h) usando AC_CHECK_HEADER. Dentro do AC_CHECK_HEADER, adiciono o local ao CPFLAGS e a #include do arquivo de cabeçalho no código C real o escolhe bem.

Dado um argumento de configuração que foi colocado em $ location e o nome dos arquivos necessários são helper.he helper.a (ambos no mesmo diretório), eis o que funciona até agora:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"])

Quando encontro dificuldades, é vincular o binário (um arquivo .a). Não importa o que eu tente, sempre recebo um erro sobre referências indefinidas às chamadas de função dessa biblioteca. Tenho certeza de que é um problema de ligação, porque posso mexer com o código C e cometer um erro intencional nas chamadas de função para essa biblioteca que produz erros anteriores que indicam que os protótipos da função foram carregados e usados para compilar.

Tentei adicionar o local que contém o arquivo .a ao LDFLAGS e executar um AC_CHECK_LIB, mas ele não foi encontrado.

Talvez minha sintaxe esteja errada ou talvez esteja perdendo algo mais fundamental, o que não seria surpreendente, pois sou novato e realmente não sei o que estou fazendo.

Aqui está o que eu tentei:

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

Sem dados. AC_CHECK_LIB está procurando -lhelper, eu acho (ou libhelper?), Então não tenho certeza se isso é um problema, então tentei isso também (omita AC_CHECK_LIB e inclua o .a diretamente no LDFLAGS), sem sorte:

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

Para emular a compilação manual, tentei remover o -L, mas isso não ajuda:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS $location/helper.a"])

Tentei outras combinações e permutações, mas acho que posso estar perdendo algo mais fundamental ...

================ ATUALIZAÇÃO

Eu consegui trabalhar com um caminho codificado para o arquivo .a no Makefile.am usando _LDADD assim:

myprog_LDADD=/home/john/mystuff/helper.a

Mas não posso prever a localização do arquivo .a. Por alguma razão, definir myprog_LDADD no configure.ac não funciona (eu gostaria que funcionasse, para que eu possa usar minha variável de localização dinâmica) e nenhuma combinação de alterações no LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS parece funcionar.

Se, no Makefile.am, eu tentar usar o local variável definido no configure.ac, ele não funcionará

myprog_LDADD=($location)helper.a

================ ATUALIZAÇÃO

Acho que descobri, mas como não tenho ideia do que estou fazendo, eu realmente aprecio alguns comentários. Eu usei o AC_SUBST () para fazer com que o myprog_LDADD funcionasse no configure.ac, então a solução final fica assim:

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

questionAnswers(1)

yourAnswerToTheQuestion