使用 SCons TryCompile 检查 Windows 上的编译器标志支持

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

通过 GCC 和 clang,我已经能够使用 SCons 的“TryCompile”功能来构建一个简单的配置检查,以确定当前配置的编译器是否支持给定的编译标志。基本上,克隆环境,将有问题的标志添加到 CFLAGS、CCFLAGS 或 CXXFLAGS,根据需要,执行 TryCompile,如果 TryCompile 成功,则支持该标志,我们可以将其添加到真实的环境中。

  • 这与 gcc 完美配合,因为未知标志是错误,并且编译器以非零状态退出。
  • 使用 clang,它也工作得相当好:默认情况下 clang 将未知错误视为警告,但如果你传递它 -Werror 它将把未知标志变成错误。因此,我的 TryCompile 包装器总是传递 -Werror 以及要测试的标志(如果它知道我们正在使用 clang)。

但是,这一切都在 Microsoft 工具链中失败了,因为据我所知,没有办法说服编译器将未知标志视为错误:它们始终是警告,即使您传递标志来发出警告错误。由于编译会干净地退出,无论标志是否被接受,TryCompile 总是会成功。有关我为使 MSVC 以非零状态退出而进行的各种尝试的详细信息,请参阅此问题

关于如何完成这项工作有什么想法吗?是否有另一个我忽略的 SCons 设施可以为我完成这项工作?我是否应该在 MS 平台上插入 TryCompile 并解析编译器输出而不是检查退出状态。我真的很高兴使用 TryCompile 通过 clang 和 gcc 来配置时间标志检测,但如果我无法让 MSVC 合作,我将需要放弃整个方法,而且我非常不愿意这样做,因为到目前为止效果很好。

visual-studio warnings configure scons
2个回答
1
投票

再次让 Windows 来给游行带来惊喜:) 显然,无论发生什么,Windows 编译器总是返回成功。

我可以想到几个你可以尝试的选项。

首先,SCons 提供了多平台配置(Autoconf 功能),可以帮助您实现相同的结果。它不包含任何编译器选项,但至少包含以下内容:

  • 检查头文件是否存在
  • 检查功能的可用性
  • 检查库的可用性
  • 检查 typedef 的可用性
  • 添加您自己的自定义检查

另一种选择是使用 Microsoft 编译选项构建某种字典。每个编译器版本可能需要一本字典。这个特殊的选择可能需要很长时间来准备,而且可能不值得。

另一种选择是使用 Object() 或 Program() 构建器而不是 TryCompile() 构建器,并尝试“捕获”失败并做出相应反应。我不确定 SCons 是否允许您将编译失败作为异常捕获并在失败时继续,但它值得检查。


0
投票
错误报告

之后,添加了以下标志: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 - 2025. All rights reserved.