在cmake中,我如何将-std=c++11标志应用于c++代码,但不应用于同一目录中的c代码



在一个目录中混合了C++和C代码的项目中,我需要-std=C++11标志来应用C++代码,而不是C代码。(因为这会导致MacOS出现错误。(

目前我这样做:

add_compile_options( -std=c++11 )

但是,add_compile_options((函数上似乎没有任何选项允许我指定这些标志只能用于C++文件。

在自动工具中,这可以通过为C++设置CXXFLAGS和为C代码设置CFLAGS来实现。在CMake中有没有同样的方法?

任何事情都不要使用add_compile_options!在最坏的情况下,您可以使用target_compile_options,但对于设置语言标准,CMake有特殊的支持,这应该始终是首选。

对于要编译为C++11的目标,只需编写:

target_compile_features(my_target PRIVATE cxx_std_11)

您应该在其他答案中使用target_compile_features,如果没有,请使用其他答案中提供的set_property。尽管如此,您还是可以通过生成器表达式将compile_options专门传递给C++编译器

# prefer other answers to it
add_compile_options(
$<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
)

这里有一种方法。请注意,您必须指定所需的属性。我喜欢禁用扩展,使其不依赖于任何编译器特定的标志。

set_target_properties(myTarget
PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
)

这可以使用完成

# Setting your C++ standard.
set_property(TARGET your_target PROPERTY CXX_STANDARD 11)
# Setting your C standard.
set_property(TARGET your_target PROPERTY C_STANDARD 11)

当然,标准编号必须是支持的版本号:

  • 对于C++,这包括:98、11、14、17、20和23
  • 对于C,这包括:90、99和11

您不必同时使用它们。因此,您可以要求CMake在使用默认C标准的同时使用C++11。

最新更新