为什么gcc只将此解释为单一选项?

时间:2017-09-30 14:23:21

标签: powershell gcc windows-10 pkg-config

我正在尝试在PowerShell上编译gtk程序,以便我可以使用pkg-config的输出作为gcc的输入,但是gcc将整个输出作为单个命令行选项并返回错误:

  

gcc.exe:错误:无法识别的命令行选项'-mms-bitfields   -pthread -mms-bitfields -IC:/gtk/include/gtk-3.0 -IC tk / include / cairo -IC:/ gtk / include -IC:/gtk/include/pango-1.0 -IC:/ gtk / include / atk-1.0 -IC:/ gtk / include / cairo -IC:/ gtk clude / pixman-1 -IC:/ gtk / include -IC:/ msys / opt / include -IC:/ msys / opt / include / freetype2 - IC:/ msys / opt / include -IC:/ msys t / include / libpng16 -IC:/ gtk / include -IC:/ gtk / include / freetype2 -IC:/ gtk / include -IC:/ gtk / include / libpng16 -IC:/ gtk / in de / gdk-pixbuf-2.0 -IC:/ gtk / include / libpng16 -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include -LC: / gtk / lib -lgt -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lz -lpangowin32-1.0 -lp ocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl'

我正在使用的命令行:

gcc hello.c -o hello $(pkg-config.exe --cflags --libs gtk+-3.0)

我也试过了:

$(gcc hello.c -o hello $(pkg-config.exe --cflags --libs gtk+-3.0))

要么返回相同的结果。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

似乎pkg-config.exe --cflags --libs gtk+-3.0命令将其输出作为单行返回,因此在PowerShell中它被解析为单个string对象。当 string包含空格(实际规则更复杂且依赖于版本)传递给本机应用程序时,PowerShell会尝试提供帮助并添加引号,因此它将被解释为单个参数。阻止它的一种方法是使用'--%'“operator”:

gcc hello.c -o hello '--%' $(pkg-config.exe --cflags --libs gtk+-3.0)

请注意,它实际上不是--%运算符,因此它不会使字符串的其余部分按字面解释。实际上它只是值为--%的字符串。

发生“魔术”是因为当本机应用程序的PowerShell命令行构建器遇到--%字符串时,它会禁用带有空格的参数的自动引用,以用于任何剩余的参数。它还通过[Environment]::ExpandEnvironmentVariables传递它们以%VariableName%形式解析环境变量。