DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
我一直在寻找便携式方式来强制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

所以我发现这个帖子:Enabling C99 in CMake和相关的功能要求:0012300: CMake has no cross-platform way to ask for C99.在这个螳螂错误中,我了解了target_compiler_features,之后我发现了这些SOF答案:How to activate C++11 in CMake?How to detect C++11 support of a compiler with CMake.

所以我的问题是:这个target_compiler_features将提供一种要求C功能和C功能的方法?现在最流行的方式是什么 – 我正在使用CMake 2.8.12.2. target_compiler_features不在CMake的最新版本(3.0.0)中.你知道什么时候被释放吗?

 
创建目标(如库或可执行文件)后,将这样的行放在您的CMakeLists.txt文件中:

 

 

set_property(TARGET tgt PROPERTY C_STANDARD 99)

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

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

http://www.cmake.org/cmake/help/v3.1/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)

将该宏放置在顶级文件中,以便随处可见,您可以在任何使用C99代码定义目标的CMakeLists文件的顶部写入use_c99().

posted on   DoubleLi  阅读(1437)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2019-10-23 集中式VS分布式
2012-10-23 VC对话框全屏显示及相应控件位置改变(转)
2012-10-23 CenterWindow()的用法 .
2012-10-23 SystemParametersInfo系统信息获取与设置,慎用
2012-10-23 在MFC中从中如何制作图形按钮 .
2012-10-23 如何给MFC对话框添加背景图片 .
2012-10-23 MFC程序执行顺序 .
点击右上角即可分享
微信分享提示