Использование `pkg-config` в качестве аргумента командной строки в cygwin / msys bash - PullRequest
4 голосов
/ 19 сентября 2008

Я пытаюсь использовать cygwin в качестве среды сборки под Windows. У меня есть некоторые зависимости от сторонних пакетов, например, 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, что действительно ужасно. Есть ли хороший способ обойти или исправить эту проблему?

Сделать не виновник. Я могу скопировать и вставить командную строку, которая делает использование для вызова 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 на единицу больше, чем должно быть, а argv [argc - 1] равно нулю. Запуск такого же теста в Linux не дает такого результата.

Тем не менее, есть, скажем, какой-нибудь способ, которым я мог бы заставить Makefile сохранить результат pkg-config в переменную, а затем использовать эту переменную вместо использования оператора обратной галочки?

Ответы [ 6 ]

6 голосов
/ 20 сентября 2008

Тем не менее, есть, скажем, какой-нибудь способ, которым я мог бы сделать так, чтобы Makefile сохранил результат pkg-config в переменную, а затем использовал эту переменную вместо использования оператора обратной галочки?

GTK_LIBS = $ (оболочка pkg-config --libs gtk + -2.0)

4 голосов
/ 19 сентября 2008

Вы уверены, что используете марку, предоставленную Cygwin? Используйте

which make
make --version

для проверки - должны возвращаться "/ usr / bin / make" и "GNU Make 3.8 [...]" или что-то подобное.

2 голосов
/ 19 сентября 2008

Хммм ... ты пробовал

make -d

Это даст вам (много) отладочной информации.

1 голос
/ 28 июня 2011

У меня была похожая проблема, и я нашел здесь исправление: http://www.demexp.org/dokuwiki/en:demexp_build_on_windows

Позаботьтесь о том, чтобы поместить / usr / bin перед / cygwin / c / GTK / bin в вашу переменную PATH, чтобы вы использовали / usr / bin / pkg-config. Это необходимо, потому что пути пост-процессов GTK pkg-config часто преобразовывают их в эквиваленты абсолютных путей Windows. Как следствие, инструменты в Cygwin могут не понимать эти пути.

1 голос
/ 20 сентября 2008

Одиночная кавычка в конце вывода "t" может быть артефактом перевода CRLF. Является ли ваш pkg-config приложением cygwin? Решение $ (shell), которое я разместил ранее, может помочь в этом, поскольку GNU make, похоже, довольно терпимо относится к различным стилям окончания строки.

1 голос
/ 20 сентября 2008

Полагаю, gg cygwin не может обрабатывать -Lc: / mingw / lib. Попробуйте перевести это на путь cygwin.

GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
...