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