Cmake基础教程(一)
1、基础信息
cmake_minimum_required(VERSION 3.23) # 所需cmake的最低版本
set(CMAKE_C_STANDARD 99) # c/cxx语言编译标准
project(test) # 项目名称 / 库名称
上述3条信息是CMakeLists中最基础的,也是必须的3条信息。
2、定义变量
定义变量使用的是set变量,同时通过设置变量,可以达到简化CMake表达的作用。使用方法:set(变量名 变量值)。例如:
set(APPNAME test) # 设置可执行程序名
set(LIBPATH ${PROJECT_SOURCE_DIR}/lib) # 设置静态库路径( ${ } 为变量引用方式)
3、添加并构建子目录
add_subdirectory:添加并构建子目录。共有3个参数:source_dir 为必选参数,该参数指定一个子目录 (绝对路径 / 相对路径),同时子目录下应该包含一个 CMakeLists.txt文件和代码文件用于构建。binary_dir 为可选参数,指定输出文件的存放目录,默认为source_dir。EXCLUDE_FROM_ALL 为可选参数,子目录下的目标不会被父目录下的目标文件包含进去,父目录的CMakeLists.txt不会构建子目录的目标文件,必须在子目录下显式去构建。
4、链接库
CMake 中链接库主要有两个命令:link_libraries 和 target_link_libraries
link_libraries 用于链接静态库,包含库名和路径两个变量,其中,库名可以使用全称(libxx.a),也可以使用简称 (掐头去尾xx),如果静态库是第三方的,可以使用 link_directories将静态库路径指定出来,避免出现找不到静态库的情况。
target_link_libraries 用于链接动态库,包含目标名、库访问权限、库名三个变量。target (目标) 可以是一个源文件、动态库、可执行文件。权限有PUBLIC(允许第三方访问)、PRIVATE(不允许第三方访问)、INTERFACE(不链接,只导出符号)三种,默认为PUBLIC,
当访问权限为 PUBLIC 时,动态库的链接具有传递性:当动态库 A 同时链接了动态库 B 和 C,那么在下次只需要链接动态库 A,就可以使用 B 和 C 中的函数了。
link_libraries 置于生成目标之前,target_link_libraries 置于生成目标之后。
5、包含头文件目录
使用 include_directories 包含一个或多个头文件目录,可以是相对路径,也可以是绝对路径。
常见的路径表达方式:
① CMAKE_BINARY_DIR / PROJECT_BINARY_DIR:生成的库、可执行文件等的存放位置,工程顶层目录(in) / 工程编译发生的目录(out)。
② CMAKE_SOURCE_DIR / PROJECT_SOURCE_DIR:工程顶层目录。
③ CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt 所在的路径。
④ CMAKE_CURRENT_BINARY_DIR:当前CMakeLists.txt 所在的构建目录的路径。
⑤ CMAKE_LIBRARY_OUTPUT_DIRECTORY:库文件的输出目录。
⑥ CMAKE_RUNTIME_OUTPUT_DIRECTORY:可执行文件的输出目录。