添加生成器表达式
在构建系统生成期间会评估生成器表达式,以生成特定于每个构建配置的信息。
在许多目标属性(例如LINK_LIBRARIES,INCLUDE_DIRECTORIES,COMPLIE_DEFINITIONS等)的上下文中允许生成器表达式。在使用命令填充这些属性(例如target_link_libraries(),target_include_directories() ,target_compile_definitions()等)时,也可以使用它们。
生成器表达式可用于启用条件链接,编译时使用的条件定义,条件包含目录等。条件可以基于构建配置,目标属性,平台信息或任何其他可查询信息。
生成器表达式有不同类型,包括逻辑,信息和输出表达式。
逻辑表达式用于创建条件输出。基本表达式是0和1表达式。$<0:...>导致空字符串,而<1:...>导致内容“…”。它们也可以嵌套。
生成器表达式的常见用法是有条件地添加编译器标志,例如用于语言级别或警告的标志。一个不错的模式是将该信息与一个INTERFACE目标相关联,以允许该信息传播。让我们从构造一个INTERFACE目标并指定所需的C++标准级别11开始,而不是使用CMAKE_CXX_STANDARD。
所以,下面的代码:
# 指定 C++ 标准
集(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
将被替换为:
add_library(tutorial_compiler_flags 接口)
target_compile_features(tutorial_compiler_flags 接口 cxx_std_11)
接下来,我们为项目添加所需的编译器警告标志。由于警告标志根据编译器的不同而不同,因此我们使用COMPILE_LANG_AND_ID生成器表达式来控制在给定一种语言和一组编译器ID的情况下应应用的标志,如下所示:
设置(gcc_like_cxx“$ <COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU>”)
设置(msvc_cxx“$ <COMPILE_LANG_AND_ID:CXX,MSVC>”)
target_compile_options(tutorial_compiler_flags INTERFACE
“$ <$ {gcc_like_cxx}:$ <BUILD_INTERFACE : -Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>"
"$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)
查看此内容,我们看到警告标志封装在BUILD_INTERFACE条件内。这样做是为了使我们已安装项目的使用者不会继承我们的警告标志。
练习:修改MathFunctions/CMakeLists.txt,以便所有目标都具有对tutorial_compiler_flagstarget_link_libraries()调用。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!