出于各种原因,我希望能够编写脚本来检测 MS C++ 编译器是否支持特定标志。我正在使用 Windows 7.1 SDK 中的编译器:
C:\> cl /version
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
所以可以说我想知道这个编译器是否支持标志
/GLEFGB
(它不支持,因为它不存在):
C:\>cl /c ./foo.cc /GLEFBG
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line warning D9002 : ignoring unknown option '/GEFBG'
foo.cc
好的,好的开始,但这是一个警告,并且它没有将退出状态设置为无效:
C:\>echo %errorLevel%
0
所以,如果我们使用
/WX
将警告打开为错误,我们就应该完成了,对吗?
C:\>cl /c ./foo.cc /WX /GLEFBG
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line warning D9002 : ignoring unknown option '/GEFBG'
foo.cc
错了。这越来越让人失望了。也许D9002由于某种原因没有被
/WX
捕获?也许我们可以通过在该代码中使用 /we
来显式地使其成为错误?想猜猜这是否有效?
C:\>cl /c ./foo.cc /WX /weD9002 /GLEFBG
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line error D8021 : invalid numeric argument '/weD9002'
不,现在我们出错了,因为显然这个编译器警告的标签不是
/we
的合法参数。我也试过/we9002
,也没用。
所以,现在我没有主意了。关于如何说服
cl
在传递无效标志时以非零退出状态出错的任何想法?如果没有这种行为,真的很难询问编译器是否支持标志。
我也遇到了同样的问题。虽然
cl
不报告它们,但您也许可以检查 cl
的输出。
我最终编写了一个执行另一个程序的Python脚本,如果该程序返回错误或程序向
stderr
写入任何内容,则脚本会报告失败(即退出代码1):
#!/usr/bin/python3
import subprocess
import sys
proc = subprocess.Popen(sys.argv[1:], stderr=subprocess.PIPE)
got_error = False
for l in proc.stderr:
try:
print(str(l, errors="replace"), end="")
except TypeError:
print(str(l), end="")
got_error = True
proc.wait()
if got_error or proc.poll() != 0:
sys.exit(1)
我已经在 cygwin 下尝试过了,但它也应该在 dos 提示符下工作(也许你必须用 python 解释器专门调用它):
python3 chkerr cl /c ./foo.cc /GLEFBG
其中
chkerr
是我给脚本起的名称。
在@HansPassant 错误报告之后,添加了以下标志:Visual Studio 2022 版本 17.0 预览版 4。
/options:strict unrecognized compiler options are an error
> cl /options:strict /empanadas test.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33808 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line error D8043 : unknown option '/empanadas'