我一直在寻找一种可移植的方式来强制 CMake 启用编译器的 C99 功能,以避免出现以下 gcc
错误,例如:
error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int s = 1; s <= in_para->StepNumber; s++){
^
我也不想检查哪个编译器并附加如下内容:
set(CMAKE_C_FLAGS "-std=c99") # that would be bad
所以我找到了这篇文章: 在 CMake 中启用 C99 和相关的功能请求: 0012300: CMake has no cross-platform way to ask for C99 。在这个 Mantis 错误中,我了解了 target_compiler_features
之后我在上面找到了这些 SOF 答案: 如何在 CMake 中激活 C++11? 以及 如何使用 CMake 检测编译器对 C++11 的支持。
所以我的问题是:这 target_compiler_features
将提供一种需要C特性以及C++特性的方法?到目前为止,实现这一目标的最便携方式是什么——我目前正在使用 CMake 2.8.12.2。 target_compiler_features
不在 CMake 的最新版本 (3.0.0) 中。你知道它什么时候发布吗?
原文由 Tarc 发布,翻译遵循 CC BY-SA 4.0 许可协议
创建库或可执行文件等目标后,在 CMakeLists.txt 文件中添加如下一行:
其中
tgt
是您的目标的名称。我认为这是在 CMake 3.1 中添加的,文档在这里:
http://www.cmake.org/cmake/help/latest/prop_tgt/C_STANDARD.html
如果你需要支持 3.1 之前的 CMake 版本,你可以使用这个宏:
将该宏放入您的顶级文件以便它在任何地方都可见后,您可以在任何 CMakeLists 文件的顶部写入
use_c99()
,该文件定义了一个包含 C99 代码的目标。针对 macOS 的 clang 用户的 CMake 问题 #15943
如果您使用 CMake 和 clang 来定位 MacOS,则存在可能导致
CMAKE_C_STANDARD
功能根本无法工作的 错误(不添加任何编译器标志)。确保您执行以下操作之一:使用 cmake_minimum_required 要求 CMake 3.0 或更高版本,或
在
project
命令之前,使用 CMakeLists.txt 文件顶部的以下代码将策略 CMP0025 设置为 NEW: