通过 GCC 和 clang,我已经能够使用 SCons 的“TryCompile”功能来构建一个简单的配置检查,以确定当前配置的编译器是否支持给定的编译标志。基本上,克隆环境,将有问题的标志添加到 CFLAGS、CCFLAGS 或 CXXFLAGS,根据需要,执行 TryCompile,如果 TryCompile 成功,则支持该标志,我们可以将其添加到真实的环境中。
但是,这一切都在 Microsoft 工具链中失败了,因为据我所知,没有办法说服编译器将未知标志视为错误:它们始终是警告,即使您传递标志来发出警告错误。由于编译会干净地退出,无论标志是否被接受,TryCompile 总是会成功。有关我为使 MSVC 以非零状态退出而进行的各种尝试的详细信息,请参阅此问题。
关于如何完成这项工作有什么想法吗?是否有另一个我忽略的 SCons 设施可以为我完成这项工作?我是否应该在 MS 平台上插入 TryCompile 并解析编译器输出而不是检查退出状态。我真的很高兴使用 TryCompile 通过 clang 和 gcc 来配置时间标志检测,但如果我无法让 MSVC 合作,我将需要放弃整个方法,而且我非常不愿意这样做,因为到目前为止效果很好。
再次让 Windows 来给游行带来惊喜:) 显然,无论发生什么,Windows 编译器总是返回成功。
我可以想到几个你可以尝试的选项。
首先,SCons 提供了多平台配置(Autoconf 功能),可以帮助您实现相同的结果。它不包含任何编译器选项,但至少包含以下内容:
另一种选择是使用 Microsoft 编译选项构建某种字典。每个编译器版本可能需要一本字典。这个特殊的选择可能需要很长时间来准备,而且可能不值得。
另一种选择是使用 Object() 或 Program() 构建器而不是 TryCompile() 构建器,并尝试“捕获”失败并做出相应反应。我不确定 SCons 是否允许您将编译失败作为异常捕获并在失败时继续,但它值得检查。
之后,添加了以下标志: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'