【问题标题】:Using `pkg-config` as command line argument under cygwin/msys bash在 cygwin/msys bash 下使用 `pkg-config` 作为命令行参数
【发布时间】:2010-09-11 05:37:00
【问题描述】:

我正在尝试使用 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 的结果存储到一个变量中,然后使用该变量,而不是使用反引号运算符?

【问题讨论】:

  • 我也在 Win 64 系统 (Vista64) 上并在同一点上苦苦挣扎。我注意到 thadt 32 和 64 位 GTK 安装会混淆 pkg-config 并且未正确确定 lib 路径。我现在正在寻找一个非 pkg-config 解决方案,所以我可以更好地了解链接器进程到底发生了什么。

标签: windows bash cygwin makefile pkg-config


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    which make
    make --version
    

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

    【讨论】:

      【解决方案3】:

      嗯……你试过了吗

      make -d
      

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

      【讨论】:

      • 是的,谢谢,它确实在运行 gcc,但 gcc 有问题。更新了问题。
      【解决方案4】:

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

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

      【讨论】:

      • 不,它实际上是 mingw gcc -- 我忽略了这个。
      • 是的,很高兴知道 :)。 Mingw gcc 似乎对 C:/ 路径很好。
      【解决方案5】:

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

      【讨论】:

      • 我同意这可能与 crlf 有关。 pkg-config 实际上也来自 mingw。我曾尝试放入 cygwin pkg-config,但那是使用 mingw 不喜欢的 cygwin 路径,但我确实确认 cygwin pkg-config 不会创建额外的空 argv。
      • 有趣...我的 mingw 安装中没有要测试的 pkg-config。必须是一个可选包(我有 gcc 3.4.5 mingw)。
      • 我想我发现 pkg-config 来自 GTK+ 包:gtk.org/download-windows.html
      【解决方案6】:

      我遇到了类似的问题,我在这里找到了解决方法: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 下的工具可能无法理解这些路径。

      【讨论】:

        猜你喜欢
        • 2018-03-04
        • 2023-03-17
        • 2012-01-08
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多