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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top