CMake 常用命令

cmake是现在主流的用于多平台C++构建系统,本文用来记录cmake的一些常用命令的索引,加上一些自己理解,理解有误的话,欢迎大家指出。

常用路径

CMAKE_SOURCE_DIR: 顶级cmakelists.txt的文件夹目录。
CMAKE_BINRAY_DIR: 对应cmake的build的目录,主要是运行时生成的文件目录。
CMAKE_CURRENT_SOURCE_DIR: 一般来说,一个工程会有多个cmakelists.txt文件,对应当前文件目录。
CMAKE_CURRENT_BINARY_DIR: 对应build里的目录。
CMAKE_MODULE_PATH: api(include/find_package)包含别的cmake文件时的搜索目录。
CMAKE_PREFIX_PATH: api(find_libray/path)包含模块时的搜索目录。
CMAKE_INSTALL_PREFIX: 调用install相关函数,要生成/保存的根目录路径。

常用内置变量

系统:WIN32/APPLE/ANDROID
方案配置:CMAKE_BUILD_TYPE(Release/Debug),VS Code里配合cmake.configureSettings/CMAKE_BUILD_TYPE可以把VS Code当前编译配置传入。
编译器:MINGW/CMAKE_COMPILER_IS_GNUCXX/CMAKE_COMPILER_IS_CLANGXX/MSVC(MSVC_VERSION C++平台工具集)
编译器64/32:CMAKE_SIZEOF_VOID_P EQUAL 8/4
简略if用法: CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS

常用API

系统API,每一个API应该说是一个库,所以具体用法自行搜索。

set 设置参数,包含一般/缓存/环境变量。
list 针对列表操作,比如针对文件列表/参数列表/编译列表的增加删除这些。
file 针对文件操作,如收集文件列表,读写文件等。
string 针对字符串的操作,如大小写,查找,正则表达式匹配等。
message 打印消息,可以跟踪测试修改。

C++编译相关

add_compile_options:不同平台一般来说有不同的编译设置。
add_definitions:添加预处理器定义。
include_directories: 如visual studio里的,头文件搜索目录,在当前项目以及当前项目用add_subdirectory添加的项目都会应用。
target_include_directories:针对指定目标的include_directories。
link_libraries: 添加库文件路径,注意是全路径,如果是本方案的项目,直接使用项目名就行。在当前项目以及当前项目用add_subdirectory添加的项目都会应用。
target_link_libraries:指定目标的link_directories。
add_library:添加库,根据参数生成静态或是动态库。
add_executable:添加执行文件。
set_target_properties:指定项目一些具体编辑器里的属性,如生成lib/dll的目录。
install:方案包含的项目多,每次把需要发给用户的 include/lib/dll按照指定目录格式放好,这个可以用来做这些。cmake默认会生成一个insatll项目,这个项目会执行所有install命令,比如生成的 include/lib/dll放入以CMAKE_INSTALL_PREFIX为根路径的目录。

常用头文件

include(CMakeDependentOption) cmake内置,包含cmake_dependent_option方法。
include(CheckCXXCompilerFlag) cmake内置,包含CHECK_CXX_COMPILER_FLAG用于检查C++标准支持情况。

常用操作

A目录 CMakeLists.txt包含B目录 CMakeLists.txt

一般有二种方式,其一存放一些共同宏,函数或是变量,放入CMAKE_MODULE_PATH指定的目录里,用include包含,其类似CMAKE_CURRENT_SOURCE_DIR指向的是执行这个函数的CMakeLists.txt,比如这里A执行B中函数,那指向A目录。其二是使用add_subdirectory,这个文件内一般会包含add_library或是add_executable,CMAKE_CURRENT_SOURCE_DIR针对的是当前这个文件目录,如上就是B所在目录,B这种文件一般放在方案下的每个项目内。

引入第三方库

find_package(LibaryName)根据对应CMAKE_MODULE_PATH找到对应的Find<LibaryName>.cmake,一般来说,有如下三下变量(你也可以定义成别的名字)。

  • <LibaryName>_FOUND 是否找到库
  • <LibaryName>_INCLUDE_DIR <LibaryName>_INCLUDES 库头文件目录
  • <LibaryName>_LIBRARY <LibaryName>_LIBRARIES 库链接文件路径
    如果我们引用的第三方库没有提供Find<LibaryName>.cmake,我们可以自己写,只需要填充上面上面变量,就可以使用find_package,实际一般用如下几个函数确定这三个变量,而这几个函数默认都会去CMAKE_PREFIX_PATH查找:

FIND_PACKAGE_HANDLE_STANDARD_ARGS:<LibaryName>_FOUND
find_path:获得<LibaryName>_INCLUDE_DIR目录。
find_library:获得<LibaryName>_LIBRARY 目录。
结合前面的include_directories/link_libraries引用对应的<LibaryName>_INCLUDE_DIR/<LibaryName>_INCLUDE_DIR就引入第三方库了。

配置选项

option/cmake_dependent_option:给定用户选项,如是否使用某个第三库这些,是否使用某些组件等。

configure_file:把如上选项结合配置模板生成配置文件C++头文件,使C++项目能拿到用户的配置。

这样CMake变量与配置C++的头文件以及根据变量设置的预处理器定义对应上。

运行Python脚本

一般工程会在编译前或后执行一些脚本或是下载,一般配合python脚本语言使用。

find_package(PythonInterp 3 REQUIRED)

add_custom_command 使用 ${PYTHON_EXECUTABLE} 执行对应脚本并传入相应参数,完成如下载资源或是执行glsl/hlsl转spv等逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值