Utiliser `pkg-config` comme argument de ligne de commande sous cygwin / msys bash
-
01-07-2019 - |
Question
J'essaie d'utiliser cygwin comme environnement de construction sous Windows. J'ai des dépendances sur des packages tiers, par exemple, GTK +.
Normalement, lorsque je compile sous Linux, dans mon Makefile, je peux ajouter un appel à pkg-config en tant qu'argument à gcc, de sorte qu'il se présente comme suit:
gcc example.c `pkg-config --libs --cflags gtk+-2.0`
Cela fonctionne très bien sous Linux, mais sous cygwin, je reçois:
:Invalid argument make: *** [example] Error 1
Pour le moment, je suis juste en train d’exécuter manuellement pkg-config et de coller la sortie dans le Makefile, ce qui est vraiment terrible. Existe-t-il un bon moyen de contourner ou de résoudre ce problème?
Make n'est pas le coupable. Je peux copier et coller la ligne de commande qui permet à l'appel d'appeler gcc, et qui exécutera lui-même gcc, qui s'arrête avec ": argument non valide".
J'ai écrit un petit programme de test pour imprimer les arguments en ligne de commande:
for (i = 0; i < argc; i++)
printf("'%s'\n", argv[i]);
Notez les guillemets 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
Exécution du programme de test:
$ ./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' '
Notez l'unique citation sur la dernière ligne. Il semble que argc soit supérieur à ce qu'il devrait être, et argv [argc-1] est nul. Exécuter le même test sous Linux n’a pas ce résultat.
Cela dit, y a-t-il un moyen, par exemple, que le fichier Makefile stocke le résultat de pkg-config dans une variable, puis utilise cette variable plutôt que d'utiliser l'opérateur de contrôle de retour en arrière?
La solution
Cela dit, y a-t-il un moyen, par exemple, que le fichier Makefile stocke le résultat de pkg-config dans une variable, puis utilise cette variable plutôt que d'utiliser l'opérateur de contrôle de retour en arrière?
GTK_LIBS = $ (shell pkg-config --libs gtk + -2.0)
Autres conseils
Êtes-vous sûr d’utiliser la marque fournie par Cygwin? Utilisez
which make
make --version
pour vérifier - cela devrait retourner "/ usr / bin / make". et "GNU Make 3.8 [...]" ou quelque chose de similaire.
Hmmm ... avez-vous essayé
make -d
Cela vous donnera un (beaucoup) de sortie de débogage.
Je suppose que le fichier gcc de cygwin ne peut pas gérer -Lc: / mingw / lib. Essayez de traduire cela en un chemin cygwin.
GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
La citation unique à la fin du " t " la sortie peut être un artefact de la traduction CRLF. Est-ce que votre pkg-config est une application cygwin? La solution $ (shell) que j’ai proposée plus tôt peut aider à cela, car GNU make semble être assez tolérant vis-à-vis de différents styles de fin de ligne.
J'ai eu un problème similaire et j'ai trouvé une solution ici: http: //www.demexp. org / dokuwiki / fr: demexp_build_on_windows
Prenez soin de mettre / usr / bin avant / cygwin / c / GTK / bin dans votre CHEMIN afin d’utiliser / usr / bin / pkg-config. Cela est nécessaire car pkg-config de GTK post-traite les chemins, les transformant souvent en leurs équivalents de chemins absolus Windows. En conséquence, les outils sous cygwin peuvent ne pas comprendre ces chemins.