3

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

4

1 回答 1

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我给脚本起的名字在哪里。

于 2016-02-05T12:31:33.307 回答