我正在尝试将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的结果存储到变量中,然后使用该变量,而不是使用反向运算符?
答案 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下的工具可能无法理解这些路径。