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

问题描述 投票:0回答:2

出于各种原因,我希望能够编写脚本来检测 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
在传递无效标志时以非零退出状态出错的任何想法?如果没有这种行为,真的很难询问编译器是否支持标志。

visual-studio visual-c++ build build-process
2个回答
1
投票

我也遇到了同样的问题。虽然

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


0
投票

在@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'
© www.soinside.com 2019 - 2024. All rights reserved.