在 CMake 中强制使用 C99(使用“for”循环初始声明)

新手上路,请多包涵

我一直在寻找一种可移植的方式来强制 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 许可协议

阅读 1.7k
1 个回答

创建库或可执行文件等目标后,在 CMakeLists.txt 文件中添加如下一行:

 set_property(TARGET tgt PROPERTY C_STANDARD 99)

其中 tgt 是您的目标的名称。

我认为这是在 CMake 3.1 中添加的,文档在这里:

http://www.cmake.org/cmake/help/latest/prop_tgt/C_STANDARD.html

如果你需要支持 3.1 之前的 CMake 版本,你可以使用这个宏:

 macro(use_c99)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
    endif ()
  else ()
    set (CMAKE_C_STANDARD 99)
  endif ()
endmacro(use_c99)

将该宏放入您的顶级文件以便它在任何地方都可见后,您可以在任何 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:

     # Fix behavior of CMAKE_C_STANDARD when targeting macOS.
    if (POLICY CMP0025)
      cmake_policy(SET CMP0025 NEW)
    endif ()

原文由 David Grayson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题