Usando `pkg- config` como argumento de linha de comando sob cygwin / msys festa
-
01-07-2019 - |
Pergunta
Eu estou tentando usar cygwin como um ambiente de compilação no Windows. Eu tenho algumas dependências em pacotes 3o partido, por exemplo, GTK +.
Normalmente, quando eu construir no Linux, no meu Makefile posso adicionar uma chamada para pkg-config como um argumento para gcc, assim que ele sai como assim:
gcc example.c `pkg-config --libs --cflags gtk+-2.0`
Esta multa trabalha sob Linux, mas em cygwin eu recebo:
:Invalid argument make: *** [example] Error 1
Agora, eu estou apenas correr manualmente pkg-config e colando a saída para o Makefile, o que é verdadeiramente terrível. Existe uma boa maneira de solução ou correção para esse problema?
Faça não é o culpado. I pode copiar e colar a linha de comando que fazem usos para chamar gcc, e que por si só irá executar gcc, que interrompe com ": Invalid argument".
Eu escrevi um pequeno programa de testes para imprimir argumentos de linha de comando:
for (i = 0; i < argc; i++)
printf("'%s'\n", argv[i]);
Observe as aspas 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
Running através do programa de teste:
$ ./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' '
Observe a uma única citação sobre a última linha. Parece que argc é maior do que deveria ser, e argv [argc - 1] é nulo. Executando o mesmo teste no Linux não tem esse resultado.
Dito isto, há, digamos, de alguma forma eu poderia ter a Makefile armazenar o resultado de pkg-config em uma variável e, em seguida, usar essa variável, em vez de usar o operador de crase?
Solução
Dito isto, há, digamos, de alguma forma eu poderia ter a Makefile armazenar o resultado de pkg-config em uma variável e, em seguida, usar essa variável, em vez de usar o operador de crase?
GTK_LIBS = $ (shell pkg-config --libs GTK + -2.0)
Outras dicas
Você tem certeza que você está usando a marca fornecida pelo Cygwin? Use
which make
make --version
para verificar -. Isso deve retornar "/ usr / bin / make" e "GNU Make 3.8 [...]" ou algo similar
Hmmm ... você já tentou
make -d
Isso vai dar-lhe alguns (muitos) de saída de depuração.
Meu palpite seria gcc que cygwin não pode lidar com lc: / mingw / lib. Tente traduzir isso para um caminho cygwin.
GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
O apóstrofo no final da saída de "t" pode ser um artefato da tradução CRLF. É o seu pkg-config um aplicativo cygwin? A solução $ (shell) eu postei ajuda no início de maio, com isso, como GNU make parece ser bastante tolerante com diferentes estilos de linha final.
Eu tive um problema semelhante e eu achei uma correção aqui: http: //www.demexp. org / dokuwiki / en: demexp_build_on_windows
Tenha cuidado para colocar / usr / bin antes / cygwin / c / GTK / bin em seu PATH para que você use / usr / bin / pkg-config. Isso é necessário porque pkg-config pós-processos caminhos do GTK, muitas vezes transformando-os em suas janelas caminhos absolutos equivalentes. Como consequência, ferramentas sob cygwin não podem compreender esses caminhos.