在 cygwin/msys bash 下使用 `pkg-config` 作为命令行参数
-
01-07-2019 - |
题
我正在尝试使用 cygwin 作为 Windows 下的构建环境。我对 3rd 方软件包有一些依赖,例如 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并不是罪魁祸首。我可以复制并粘贴 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 比应有的值大 1,并且 argv[argc - 1] 为 null。在 Linux 上运行相同的测试不会得到此结果。
也就是说,是否有某种方法可以让 Makefile 将 pkg-config 的结果存储到变量中,然后使用该变量,而不是使用反引号运算符?
解决方案
也就是说,是否有某种方法可以让 Makefile 将 pkg-config 的结果存储到变量中,然后使用该变量,而不是使用反引号运算符?
GTK_LIBS = $(shell pkg-config --libs gtk+-2.0)
其他提示
您确定您使用的是 Cygwin 提供的 make 吗?使用
which make
make --version
检查 - 这应该返回“/usr/bin/make”和“GNU Make 3.8 [...]”或类似的东西。
嗯...你有没有尝试过
make -d
这将为您提供一些(大量)调试输出。
我的猜测是 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 make 似乎对不同的行结束样式相当宽容。
我遇到了类似的问题,我在这里找到了解决方法: 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 下的工具可能无法理解这些路径。