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

时间:2008-09-19 13:23:25

标签: windows bash cygwin makefile pkg-config

我正在尝试将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,它将以“:Invalid argument”停止。

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

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的结果存储到变量中,然后使用该变量,而不是使用反向运算符?

6 个答案:

答案 0 :(得分:6)

  

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

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

答案 1 :(得分:4)

你确定你使用的是Cygwin提供的make吗?使用

which make
make --version

要检查 - 这应该返回“/ usr / bin / make”和“GNU Make 3.8 [...]”或类似内容。

答案 2 :(得分:2)

嗯...你试过吗

make -d

这将为您提供一些(大量)调试输出。

答案 3 :(得分:1)

我的猜测是cygwin的gcc无法处理-Lc:/ mingw / lib。尝试将其转换为cygwin路径。

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

答案 4 :(得分:1)

“t”输出末尾的单引号可能是CRLF转换的工件。你的pkg-config是一个cygwin应用程序吗?我之前发布的$(shell)解决方案可能对此有所帮助,因为GNU make似乎相当容忍不同的行结束样式。

答案 5 :(得分:1)

我遇到了类似问题,我在此处找到了解决方法:http://www.demexp.org/dokuwiki/en:demexp_build_on_windows

  

注意将/ usr / bin放在PATH中的/ cygwin / c / GTK / bin之前,以便使用/ usr / bin / pkg-config。这是必需的,因为GTK的pkg-config后处理路径,通常将它们转换为Windows绝对路径等价物。因此,cygwin下的工具可能无法理解这些路径。