cygwin/msys bash에서 `pkg-config`를 명령줄 인수로 사용
-
01-07-2019 - |
문제
Windows에서 cygwin을 빌드 환경으로 사용하려고 합니다.GTK+와 같은 타사 패키지에 일부 종속성이 있습니다.
일반적으로 Linux에서 빌드할 때 Makefile에서 pkg-config에 대한 호출을 gcc에 대한 인수로 추가할 수 있으므로 결과는 다음과 같습니다.
gcc example.c `pkg-config --libs --cflags gtk+-2.0`
이것은 Linux에서는 잘 작동하지만 cygwin에서는 다음을 얻습니다.
:Invalid argument make: *** [example] Error 1
지금은 수동으로 pkg-config를 실행하고 출력을 Makefile에 붙여넣고 있는데 정말 끔찍합니다.이 문제를 해결하거나 수정할 수 있는 좋은 방법이 있습니까?
Make가 범인은 아닙니다.gcc를 호출하는 데 사용하는 명령줄을 복사하여 붙여넣을 수 있으며, 그 자체로 gcc가 실행되고 ":잘못된 인수입니다."
명령줄 인수를 인쇄하기 위해 작은 테스트 프로그램을 작성했습니다.
for (i = 0; i < argc; i++)
printf("'%s'\n", argv[i]);
작은따옴표에 주목하세요.
$ 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
테스트 프로그램 실행:
$ ./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' '
마지막 줄에 작은따옴표 하나가 있습니다.argc는 예상보다 1이 더 크고 argv[argc - 1]은 null인 것 같습니다.Linux에서 동일한 테스트를 실행하면 이 결과가 나오지 않습니다.
즉, 백틱 연산자를 사용하는 대신 Makefile에서 pkg-config의 결과를 변수에 저장한 다음 해당 변수를 사용할 수 있는 방법이 있습니까?
해결책
즉, 백틱 연산자를 사용하는 대신 Makefile에서 pkg-config의 결과를 변수에 저장한 다음 해당 변수를 사용할 수 있는 방법이 있습니까?
GTK_LIBS = $(shell pkg-config --libs gtk+-2.0)
다른 팁
Cygwin에서 제공하는 make를 사용하고 있습니까?사용
which make
make --version
확인하려면 - "/usr/bin/make" 및 "GNU Make 3.8 [...]" 또는 이와 유사한 것을 반환해야 합니다.
흠...시도해 봤어?
make -d
그러면 많은 디버깅 출력이 제공됩니다.
내 생각에는 cygwin의 gcc가 -Lc:/mingw/lib를 처리할 수 없는 것 같습니다.이를 cygwin 경로로 변환해 보십시오.
GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
"t" 출력 끝에 있는 작은따옴표는 CRLF 번역의 인공물일 수 있습니다.pkg-config가 cygwin 앱인가요?이전에 게시한 $(shell) 솔루션이 이 문제에 도움이 될 수 있습니다. GNU make는 다양한 줄 끝 스타일에 상당히 관대해 보이기 때문입니다.
비슷한 문제가 있었는데 여기서 해결 방법을 찾았습니다. http://www.demexp.org/dokuwiki/en:demexp_build_on_windows
/usr/bin/pkg-config를 사용할 수 있도록 PATH에서 /cygwin/c/GTK/bin 앞에 /usr/bin을 넣어야 합니다.이는 GTK의 pkg-config가 경로를 후처리하고 종종 해당 경로를 Windows 절대 경로로 변환하기 때문에 필요합니다.결과적으로 cygwin의 도구는 해당 경로를 이해하지 못할 수 있습니다.