CMake从无到有

本文简要记录cmake学习方法。
CMake核心思想:以executable为核心,executable由各类library link而成,而各种library由各类cxx源文件compile而成,所以要写清楚它们之间的关系。同时,也要配置各类variables、properties、include、subdirectory等要素,使得上述文件->库->可执行程序能被顺利找到,能被按要求顺利编译。
在CMakeLists.txt中,主要涵盖以下命令:

cmake_minimum_required(VERSION <version>)
project(xxx)

add_library(<target> <lib_files>)
add_executable(${PROJECT_NAME} <dependent files>)
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR} ${<include of lib_files>})
target_link_libraries(${PROJECT_NAME} PUBLIC ${EXTRA_LIBS})

target_compile_features(xxx ) # used for c standard
target_compile_options(xxx) # used for -x, e.g., -f -W
target_compile_definition(xxx) #used for #ifdef xxx
  1. 比较常规的方法定义如何编译:
    1 先加一个INTERFACE库,专门定义option:add_library(compiler_flags INTERFACE)
    2 指定具体的features(c++标准):target_compile_features(compiler_flags INTERFACE cxx_std_11)
    3 指定具体的option:
    target_compile_options(compiler_flags INTERFACE "$<${gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>" "$<${msvc_cxx}:-W3>" ) (举例)
    4 链接:target_link_libraries(<target> compiler_flags)
    这么做的原因是:易于导出(export)和安装(install)(官网tutorial说的)
    5 如果要改变target的属性,用set_target_properties,比如要改变生成的路径,LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}
  2. 生成表达式(generator expression)常用在编译选项中,在build时确定。本质上是一个变量的简化版本,省了许多if else。

PS:CMake 3.19及以后有了presets,可通过json文件记录configuration以便共享,看起来很厉害,不知道能不能直接取代cmakelists。留个坑以后来填。

猜你喜欢

转载自blog.csdn.net/qq_44345567/article/details/127724254