如何使Microsoft C ++编译器将未知标志视为错误而不是警告?

时间:2013-03-06 22:50:01

标签: visual-studio visual-c++ build build-process

由于各种原因,我希望能够检测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以非零退出状态出错?如果没有这种行为,很难询问编译器的标志支持。

1 个答案:

答案 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是我给脚本的名称。