4

我正在尝试使用 cygwin 作为 Windows 下的构建环境。我对 3rd 方包有一些依赖关系,例如 GTK+。

通常,当我在 Linux 下构建时,在我的 Makefile 中,我可以添加对 pkg-config 的调用作为 gcc 的参数,所以结果如下:

gcc example.c `pkg-config --libs --cflags gtk+-2.0` 

这在 Linux 下运行良好,但在 cygwin 中我得到:

:无效的论点
make: *** [示例] 错误 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'
'-lint'
'

注意最后一行的单引号。看起来 argc 比它应该的大一,并且 argv[argc - 1] 为空。在 Linux 上运行相同的测试没有这个结果。

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

4

6 回答 6

6

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

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

于 2008-09-19T23:38:58.717 回答
4

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

which make
make --version

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

于 2008-09-19T14:13:16.067 回答
2

嗯……你试过了吗

make -d

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

于 2008-09-19T14:59:32.103 回答
1

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

GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
于 2008-09-19T23:58:03.087 回答
1

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

于 2008-09-20T00:06:38.183 回答
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 下的工具可能无法理解这些路径。

于 2011-06-27T20:57:29.723 回答