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

StackOverflow https://stackoverflow.com/questions/101767

Вопрос

Я пытаюсь использовать 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 могут не понимать эти пути.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top