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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top