在cygwin / msys bash下使用pkg-config作为命令行参数

时间:2020-03-06 14:25:53  来源:igfitidea点击:

我正在尝试使用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中,这确实很糟糕。是否有解决此问题的好方法?

Make不是罪魁祸首。我可以复制并粘贴用于调用gcc的命令行,它本身将运行gcc,并以":Invalid arguments"暂停。

我写了一个小的测试程序来打印出命令行参数:

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]为空。在Linux上运行相同的测试不会产生此结果。

就是说,是否有某种方法可以让Makefile将pkg-config的结果存储到一个变量中,然后使用该变量,而不是使用反-运算符?

解决方案

我们确定使用的是Cygwin提供的商标吗?使用

which make
make --version

要进行检查,应返回" / usr / bin / make"和" GNU Make 3.8 [...]"或者类似的内容。

嗯...你试过了吗

make -d

这将为我们提供一些调试输出。

That said, is there, say, some way I could have the Makefile store the result of pkg-config into a variable, and then use that variable, rather than using the back-tick operator?

GTK_LIBS = $(shell pkg-config --libs gtk + -2.0)

我的猜测是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似乎可以容忍不同的行尾样式。