我一直在寻找便携式方式来强制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().