El uso de `pkg-config` como argumento de línea de comandos bajo cygwin/msys bash
-
01-07-2019 - |
Pregunta
Estoy tratando de usar cygwin como un entorno de compilación en Windows.Tengo algunas dependencias en la 3ª parte de los paquetes, por ejemplo, GTK+.
Normalmente cuando voy a construir en Linux, en mi Make me puede agregar una llamada a pkg-config como un argumento para gcc, por lo que sale así:
gcc example.c `pkg-config --libs --cflags gtk+-2.0`
Esto funciona muy bien en Linux, pero en cygwin que obtengo:
:Invalid argument make: *** [example] Error 1
Ahora, estoy solo manualmente ejecutando pkg-config y pegar el resultado en el archivo Makefile, que es verdaderamente terrible.Hay una buena manera de solución o corrección para este problema?
Hacer no es el culpable.Puedo copiar y pegar la línea de comandos que hacen que se utiliza para llamar a gcc, y que por sí mismo se ejecute gcc, que se detiene con ":Argumento no válido".
Escribí un pequeño programa de prueba para imprimir los argumentos de línea de comandos:
for (i = 0; i < argc; i++)
printf("'%s'\n", argv[i]);
Aviso de las comillas simples.
$ pkg-config --libs gtk+-2.0 -Lc:/mingw/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpang owin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule- 2.0 -lglib-2.0 -lintl
Se ejecuta a través del programa de prueba:
$ ./t `pkg-config --libs gtk+-2.0` 'C:\cygwin\home\smo\pvm\src\t.exe' '-Lc:/mingw/lib' '-lgtk-win32-2.0' '-lgdk-win32-2.0' '-latk-1.0' '-lgdk_pixbuf-2.0' '-lpangowin32-1.0' '-lgdi32' '-lpangocairo-1.0' '-lpango-1.0' '-lcairo' '-lgobject-2.0' '-lgmodule-2.0' '-lglib-2.0' '-lintl' '
Aviso la única cita en la última línea.Parece argc es uno más grande de lo que debería ser, y argv[argc - 1] es nulo.Ejecución de la misma prueba en Linux no tiene este resultado.
Dicho esto, hay, digamos, de alguna manera yo podría tener el Makefile almacenar el resultado de pkg-config en una variable, y luego usar esa variable, en lugar de utilizar la parte de atrás la marca de la operadora?
Solución
Dicho esto, hay, digamos, de alguna manera yo podría tener el Makefile almacenar el resultado de pkg-config en una variable, y luego usar esa variable, en lugar de utilizar la parte de atrás la marca de la operadora?
GTK_LIBS = $(shell pkg-config --libs gtk+-2.0)
Otros consejos
Está usted seguro de que está usando la marca proporcionada por Cygwin?Uso
which make
make --version
para el check - esto debería devolver "/usr/bin/make" y "Make de GNU 3.8 [...]" o algo similar.
Hmmm...has probado
make -d
Que le den algunas (muchas) de salida de depuración.
Mi conjetura sería que cygwin del gcc no puede manejar -Lc:/mingw/lib.Trate de traducir eso a un cygwin camino.
GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
La única cita en la final de la "t" de salida puede ser un artefacto de CRLF traducción.Es su pkg-config una cygwin app?El $(shell), solución que he publicado anteriormente puede ayudar con esto, como GNU make parece ser bastante tolerante con las distintas final de línea de estilos.
Yo tenía un problema similar y he encontrado una solución aquí: http://www.demexp.org/dokuwiki/en:demexp_build_on_windows
Cuidar a poner /usr/bin antes de /cygwin/c/GTK/bin en la RUTA de acceso para que usted use /usr/bin/pkg-config.Esto es necesario porque GTK es pkg-config post-procesos de caminos, a menudo, transformándolas en las Ventanas de sus rutas absolutas equivalentes.Como consecuencia de ello, las herramientas de bajo cygwin no pueden entender esos caminos.