由于各种原因,我希望能够检测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
错误。这令人失望。可能由于某种原因,/WX
没有捕获D9002?也许我们可以通过/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
以非零退出状态出错?如果没有这种行为,很难询问编译器的标志支持。
答案 0 :(得分:0)
我遇到了同样的问题。虽然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
是我给脚本的名称。