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

发布于 2024-07-05 20:38:17 字数 1318 浏览 12 评论 0原文

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

I'm trying to use cygwin as a build environment under Windows. I have some dependencies on 3rd party packages, for example, GTK+.

Normally when I build under Linux, in my Makefile I can add a call to pkg-config as an argument to gcc, so it comes out like so:

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

This works fine under Linux, but in cygwin I get:

:Invalid argument
make: *** [example] Error 1

Right now, I am just manually running pkg-config and pasting the output into the Makefile, which is truly terrible. Is there a good way to workaround or fix for this issue?

Make isn't the culprit. I can copy and paste the command line that make uses to call gcc, and that by itself will run gcc, which halts with ": Invalid argument".

I wrote a small test program to print out command line arguments:

for (i = 0; i < argc; i++)
    printf("'%s'\n", argv[i]);

Notice the single quotes.

$ 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

Running through the test program:

$ ./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'
'

Notice the one single quote on the last line. It looks like argc is one greater than it should be, and argv[argc - 1] is null. Running the same test on Linux does not have this result.

That said, is there, say, some way I could have the Makefile store the result of pkg-config into a variable, and then use that variable, rather than using the back-tick operator?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

天冷不及心凉 2024-07-12 20:38:17

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

which make
make --version

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

Are you sure that you're using the make provided by Cygwin? Use

which make
make --version

to check - this should return "/usr/bin/make" and "GNU Make 3.8 [...]" or something similar.

辞取 2024-07-12 20:38:17

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

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

That said, is there, say, some way I could have the Makefile store the result of pkg-config into a variable, and then use that variable, rather than using the back-tick operator?

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

乖乖哒 2024-07-12 20:38:17

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

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

My guess would be that cygwin's gcc can't handle -Lc:/mingw/lib. Try translating that to a cygwin path.

GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
喜爱纠缠 2024-07-12 20:38:17

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

The single quote at the end of the "t" output may be an artifact of CRLF translation. Is your pkg-config a cygwin app? The $(shell) solution I posted earlier may help with this, as GNU make seems to be fairly tolerant of different line ending styles.

不回头走下去 2024-07-12 20:38:17

我遇到了类似的问题,我在这里找到了解决方案: http://www.demexp.org/dokuwiki /zh:demexp_build_on_windows

请注意将 /usr/bin 放在 PATH 中的 /cygwin/c/GTK/bin 之前,以便使用 /usr/bin/pkg-config。 这是必需的,因为 GTK 的 pkg-config 后处理路径,通常将它们转换为其 Windows 绝对路径等效项。 因此,cygwin 下的工具可能无法理解这些路径。

I had a similar issue and I found a fix here: http://www.demexp.org/dokuwiki/en:demexp_build_on_windows

Take care to put /usr/bin before /cygwin/c/GTK/bin in your PATH so that you use /usr/bin/pkg-config. This is required because GTK's pkg-config post-processes paths, often transforming them in their Windows absolute paths equivalents. As a consequence, tools under cygwin may not understand those paths.

暖阳 2024-07-12 20:38:17

嗯...你尝试过吗?

make -d

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

Hmmm... have you tried

make -d

That will give you some (lots) of debugging output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文