为什么 gcc 仅将其解释为单一选项?
Why is gcc interpreting this as single option only?
我正在尝试在 PowerShell 上编译一个 gtk 程序,这样我就可以使用 pkg-config 的输出作为 gcc 的输入,但是 gcc 将整个输出作为一个命令行选项并且 return 错误:
gcc.exe: error: unrecognized command line option '-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))
或者return相同的结果。我该如何解决这个问题?
似乎 pkg-config.exe --cflags --libs gtk+-3.0
命令 return 其输出为单行,因此在 PowerShell 中它被解析为单个 string
对象。当 string
和空格 (实际规则更复杂且依赖于版本)传递给本机应用程序时,PowerShell 会尝试提供帮助并添加引号,因此它被解释为单个参数.一种防止它的方法是使用 '--%'
"operator":
gcc hello.c -o hello '--%' $(pkg-config.exe --cflags --libs gtk+-3.0)
请注意,它实际上不是 --%
运算符,因此它不会使该行的其余部分按字面解释。实际上它只是一个值为 --%
.
的字符串
"magic" 的发生是因为当本机应用程序的 PowerShell 命令行构建器遇到 --%
字符串时,它会禁用对参数的自动引用,并为所有剩余参数使用空格。它还通过 [Environment]::ExpandEnvironmentVariables
传递它们以解析 %VariableName%
形式的环境变量。
我正在尝试在 PowerShell 上编译一个 gtk 程序,这样我就可以使用 pkg-config 的输出作为 gcc 的输入,但是 gcc 将整个输出作为一个命令行选项并且 return 错误:
gcc.exe: error: unrecognized command line option '-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))
或者return相同的结果。我该如何解决这个问题?
似乎 pkg-config.exe --cflags --libs gtk+-3.0
命令 return 其输出为单行,因此在 PowerShell 中它被解析为单个 string
对象。当 string
和空格 (实际规则更复杂且依赖于版本)传递给本机应用程序时,PowerShell 会尝试提供帮助并添加引号,因此它被解释为单个参数.一种防止它的方法是使用 '--%'
"operator":
gcc hello.c -o hello '--%' $(pkg-config.exe --cflags --libs gtk+-3.0)
请注意,它实际上不是 --%
运算符,因此它不会使该行的其余部分按字面解释。实际上它只是一个值为 --%
.
"magic" 的发生是因为当本机应用程序的 PowerShell 命令行构建器遇到 --%
字符串时,它会禁用对参数的自动引用,并为所有剩余参数使用空格。它还通过 [Environment]::ExpandEnvironmentVariables
传递它们以解析 %VariableName%
形式的环境变量。