Использование `pkg-config` в качестве аргумента командной строки в cygwin/msys bash
-
01-07-2019 - |
Вопрос
Я пытаюсь использовать 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] имеет значение null.Выполнение того же теста в Linux не дает такого результата.
Тем не менее, есть ли какой-нибудь способ заставить Makefile сохранить результат pkg-config в переменную, а затем использовать эту переменную вместо использования оператора обратного тикания?
Решение
Тем не менее, есть ли какой-нибудь способ заставить Makefile сохранить результат pkg-config в переменную, а затем использовать эту переменную вместо использования оператора обратного тикания?
GTK_LIBS = $(shell pkg-config --libs gtk+-2.0)
Другие советы
Вы уверены, что используете марку, предоставленную Cygwin?Использовать
which make
make --version
для проверки - это должно вернуть "/usr/bin/make" и "GNU Make 3.8 [...]" или что-то подобное.
Хм...попытался ли ты
make -d
Это даст вам некоторый (много) отладочный вывод.
Я предполагаю, что gcc cygwin не может обрабатывать -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 перед /cygwin/c/GTK/bin в вашем PATH, чтобы вы могли использовать /usr/bin/pkg-config.Это необходимо, поскольку пути постобработки GTK pkg-config часто преобразуют их в эквиваленты абсолютных путей Windows.Как следствие, инструменты Cygwin могут не понимать эти пути.