Powershell 为什么gcc仅将其解释为单一选项?

Powershell 为什么gcc仅将其解释为单一选项?,powershell,gcc,windows-10,pkg-config,Powershell,Gcc,Windows 10,Pkg Config,我正在尝试在PowerShell上编译一个gtk程序,以便使用pkg config的输出作为gcc的输入,但gcc将整个输出作为单个命令行选项并返回错误: gcc.exe:错误:无法识别的命令行选项'-mms位字段 -pthread-mms位域-IC:/gtk/include/gtk-3.0-IC tk/include/cairo-IC:/gtk/include-IC:/gtk/pango-1.0-IC:/gtk/include/atk-1.0-IC:/gtk/include/cairo-IC:

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

gcc.exe:错误:无法识别的命令行选项'-mms位字段 -pthread-mms位域-IC:/gtk/include/gtk-3.0-IC tk/include/cairo-IC:/gtk/include-IC:/gtk/pango-1.0-IC:/gtk/include/atk-1.0-IC:/gtk/include/cairo-IC:/gtk clude/pixman-1-IC:/gtk/include-IC:/msys/IC:/msys/opt/include/IC/include/include/freetype2-IC:/msys/opt/IC:/msys/opt/include-IC:/msys t/libpng16-IC:/gtk/include-IC:/gtk/include/freetype2-IC:/gtk/include-IC:/gtk/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))

或者返回相同的结果。如何修复此问题?

似乎
pkg-config.exe--cflags--libs gtk+-3.0
命令将其输出作为单行返回,因此在PowerShell中它被解析为单个
字符串
对象。当带空格的
string
传递给本机应用程序时(实际规则更复杂且版本相关),PowerShell会尽力提供帮助并添加引号,因此它会被解释为单个参数。防止它的一种方法是使用
'-%'
运算符:

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


之所以会出现“魔力”,是因为当本机应用程序的PowerShell命令行生成器遇到
-->%
字符串时,它会禁用参数的自动引号,并为任何剩余参数添加空格。它还以
%VariableName%
的形式传递它们以解析环境变量。

gcc hello.c-o hello'-%'$(pkg-config.exe--cflags--libs gtk+-3.0)
工作正常,谢谢。你可以把它作为答案贴出来,这样我就可以接受了。谢谢。在windoze上构建gtk应用程序是一个巨大的难题。此外,Win7只需要这种类型的修复(或痛苦地转换到
[string[]]
),而Win10将使用pkg config而不会出现问题。下次我在windows上时,这将省去很多悲伤。。。。
gcc hello.c -o hello '--%' $(pkg-config.exe --cflags --libs gtk+-3.0)