2011-05-25 12 views
7

Estoy teniendo un poco de tiempo obteniendo autoconf para verificar la presencia de un archivo de encabezado particular.¿Por qué Autoconf no pasa la prueba AC_CHECK_HEADER cuando el archivo .h está claramente disponible?

Llamemos a la dependencia del encabezado "inky.h", y digamos que inky es una biblioteca que se instaló (por separado) con el prefijo establecido en "/ usr/local". Esto pone "inky.h" en /usr/local/inky/inky.hy libinky.so en/usr/local/lib.

ahora, estoy tratando de verificar la presencia de inky.h en mi configure.ac aplicaciones de la siguiente manera:

dnl # Setup temp LDFLAGS and look for inky library/header 
LDFLAGS_SAVE=${LDFLAGS}; 
CPPFLAGS_SAVE=${CPPFLAGS}; 

dnl # Look for inky on the user specified inky install path 
LDFLAGS ="-L${inky_library_path}"; 
CPPFLAGS="-I${inky_include_path}/inky"; 

AC_MSG_NOTICE([Looking for inky.h using: ${CPPFLAGS}]); 

dnl # This check finds inky.h just fine. This check was only used for debugging 
AC_CHECK_FILE(
    [${inky_include_path}/inky/inky.h], 
    [AC_MSG_NOTICE([Found inky.h])], 
    [AC_MSG_NOTICE([Didn't find inky.h])] 
    ) 

dnl # Look for the inky header file. If it isn't found, terminate. 
AC_CHECK_HEADER(inky.h, 
    [], 
    [AC_MSG_ERROR([Couldn't find or include inky.h])] 
    ) 

Esto produce la siguiente salida de ./configure (después de una -vfi autoreconf) :

configure: Looking for inky.y in fetk include path: -I/usr/local/include/inky.y 
checking for /usr/local/include/inky/inky.h... yes 
configure: Found inky.h 
checking inky.h usability... no 
checking inky.h presence... yes 
configure: WARNING: inky.h: present but cannot be compiled 
configure: WARNING: inky.h:  check for missing prerequisite headers? 
configure: WARNING: inky.h: see the Autoconf documentation 
configure: WARNING: inky.h:  section "Present But Cannot Be Compiled" 
configure: WARNING: inky.h: proceeding with the compiler's result 
checking for inky.h... no 
configure: error: Couldn't find or include inky.h 

Ahora bien, esto parece ser el caso, porque inky.h incluye otros 2 cabeceras, por lo que ellos añaden en el cuarto parámetro de AC_CHECK_HEADER así:

dnl # Look for the inky header file. If it isn't found, terminate. 
AC_CHECK_HEADER(inky.h, 
    [], 
    [AC_MSG_ERROR([Couldn't find or include inky.h])], 
    [dinky.h plinky.h] 
    ) 

que hace que esta salida de ./configure:

configure: Looking for inky in fetk include path: -I/usr/local/include/inky 
checking for /usr/local/include/inky/inky.h... yes 
configure: Found inky.h 
checking for inky.h... no 
configure: error: Couldn't find or include inky.h 

Estoy en mis ingenios terminan con autoconf. ¿Alguien tiene alguna idea de dónde me estoy equivocando aquí? ¿Es posible obtener la configuración para proporcionar más detalles sobre lo que está fallando? ¿Por qué puedo encontrar el archivo en sí, pero la macro AC_CHECK_HEADER falla?

Además, no me digan que use un paquete de distribución de paquetes diferente. Nunca hubiera elegido Autoconf, pero tengo que agregar algunas dependencias a un proyecto preexistente.

También tenga en cuenta que la biblioteca real no se llama "tinta". Sin embargo, hay un problema de "uso oficial solamente" para este proyecto, así que he cambiado los nombres para proteger el ... bueno, ¡para protegerme!

[Editar - Cerrar] Resolvió el problema. Ver mi respuesta

+1

Esto es probablemente solo un error tipográfico, pero no puede poner un espacio entre 'LDFLAGS' y' = "..." '(a menos que desee ejecutar el programa' LDFALGS' con '=" ... "' como primer argumento. – adl

+0

Gracias. Realmente capté ese error hace unos minutos, pero ciertamente tienes razón. Una de las cosas que odio de Autoconf es la rigidez de las reglas de espaciado. – dusktreader

Respuesta

7

me encontré con lo que el problema. La biblioteca con la que estoy trabajando es una biblioteca C, pero la biblioteca "tinta" con la que estoy enlazando es una biblioteca C++.Por lo tanto, el idioma (AC_LANG) se estableció en C al principio del script configure.ac. Mientras realizaba comprobaciones para "tinta", tuve que cambiar el idioma a C++ para que Autoconf usara el compilador C++ en lugar del compilador C. Esto se hizo con bastante facilidad mediante el uso de:

AC_LANG_PUSH([C++]) 
dnl # Do the checks for inky 
AC_LANG_POP([C++]) 

Esto resolvió el problema que tanto le pregunté acerca de este tema, y ​​en la que hand't publicados aún en donde no pude conseguir el AC_CHECK_LIB macro funcione.

Gracias a todos por su colaboración.

2

Los detalles sobre el error de esta prueba están en config.log. Mi conjetura es, sin embargo, que:

  • Puesto que no se va a añadir el camino encontrado con AC_CHECK_FILE-CPPFLAGS o INCLUDES o lo que sea autoconf está utilizando en estos días.
  • AC_CHECK_HEADER no encuentra el encabezado mediante la compilación del preprocesador (por otro motivo que el encabezado que falta en CPPFLAGS incluye).
+0

Tiene sentido como una oración Bueno, agregue un "o" y guarde la lista? –

+0

@KarlRichter He leído este pasaje unas 10 veces más. Ahora parece una oración única y completa. Lo siento por confundir, parece que estuvo en lo cierto en la primera edición. . –

+0

Yo también :) Creo que la nueva versión (que se revisará) reutiliza la segunda mitad de la oración (anteriormente el segundo elemento de la lista) para aclarar que m podría ser otras razones. WFM –

3

El cuarto argumento de AC_CHECK_HEADER no es una lista de encabezados, sino algunos códigos C que realizan el include.

Tal vez intente algo a lo largo de la línea de

AC_CHECK_HEADER([inky.h], 
[], 
[AC_MSG_ERROR([Couldn't find or include inky.h])], 
[#include <dinky.h> 
#include <plinky.h> 
]) 

o incluso

AC_CHECK_HEADERS([dinky.h plinky.h inky.h], 
[], 
[AC_MSG_ERROR([Couldn't find or include this header])], 
[#if HAVE_DINKY_H 
# include <dinky.h> 
#endif 
#if HAVE_PLINKY_H 
# include <plinky.h> 
#endif 
]) 
+0

Gracias. Tienes razón sobre ese 4to argumento. Intenté eso, pero desafortunadamente no resolvió el problema. – dusktreader

Cuestiones relacionadas