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

4
我正在尝试在Windows下使用cygwin作为构建环境。我有一些依赖于第三方包的依赖项,例如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,但会停止并显示“:无效参数”。
我编写了一个小测试程序来打印命令行参数:
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的结果存储到一个变量中,然后使用该变量,而不是使用反引号运算符?

我也在Win 64系统上(Vista64),在同一点上奋斗。 我注意到32位和64位GTK安装会让pkg-config混淆,而库路径无法正确确定。我现在正在寻找一个非pkg-config解决方案,这样我就可以更好地理解链接器过程中究竟发生了什么。 - Peter Meyer
6个回答

6

话虽如此,我是否可以通过某种方式让Makefile将pkg-config的结果存储到一个变量中,然后使用该变量,而不是使用反引号运算符呢?

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


4

您确定您正在使用Cygwin提供的make工具吗?请使用

which make
make --version

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


2

嗯...你尝试过了吗?

make -d

这将会给你提供一些(很多)调试输出。


是的,谢谢,它肯定在运行gcc,但gcc出了问题。已更新问题。 - smo

1

我曾经遇到过类似的问题,但在这里找到了解决方法:http://www.demexp.org/dokuwiki/en:demexp_build_on_windows

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


1

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

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

不好意思,实际上是mingw gcc——我忘了提到这一点。 - smo
是啊,如果早知道就好了 :). Mingw gcc 似乎对 C:/ 路径很友好。 - Adam Mitz

1

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


我同意这可能与crlf有关。pkg-config实际上也来自mingw。我曾尝试使用cygwin的pkg-config,但它使用的是cygwin路径,mingw不喜欢,但我确认cygwin的pkg-config不会创建额外的null argv。 - smo
有趣...我的mingw安装中没有pkg-config可供测试。一定是一个可选的软件包(我有gcc 3.4.5 mingw)。 - Adam Mitz
我认为我已经追踪到了pkg-config,它来自GTK+捆绑包:http://www.gtk.org/download-windows.html - smo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接