代码之家  ›  专栏  ›  技术社区  ›  smo

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

  •  4
  • smo  · 技术社区  · 18 年前

    我试图在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不是罪魁祸首。我可以复制并粘贴Make用来调用gcc的命令行,它本身就会运行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的结果存储到一个变量中,然后使用该变量,而不是使用倒勾运算符?

    6 回复  |  直到 18 年前
        1
  •  6
  •   Adam Mitz    18 年前

    也就是说,我是否可以让Makefile将pkg-config的结果存储到一个变量中,然后使用该变量,而不是使用倒勾运算符?

    GTK_LIBS=$(shell pkg配置--LIBS-GTK+-2.0)

        2
  •  4
  •   Tobias Kunze    18 年前

    你确定你使用的是Cygwin提供的品牌吗?使用

    which make
    make --version
    

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

        3
  •  2
  •   Tobias Kunze    18 年前

    嗯…你试过了吗

    make -d
    

    这将为您提供一些(大量)调试输出。

        4
  •  1
  •   Adam Mitz    18 年前

    我猜测cygwin的gcc无法处理-Lc:/mingw/lib。试着把它翻译成cygwin路径。

    GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
    
        5
  •  1
  •   Adam Mitz    18 年前

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

        6
  •  1
  •   allialliallialli    15 年前

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