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