现代cmake--阅读笔记

简介: 现代cmake--阅读笔记

1. Running cmake


1.1. cmake选项


–build 指定输出目录


-j 指定并行度


–target 指定编译目标



1.2. 选择编译器


EXPORT CC=clang CXX=clang++ cmake ..


1.3. 选择生成器


默认为make 通过cmake -G Ninja指定ninja



1.4. 指定编译选项


cmake -DXXX=YYY

cmake会将各种编译选项缓存到一个文件中,即CMakeCache.txt



1.5. 调试


调试makefile: VERBOSE=1 make

调试cmake:


  • cmake –trace, 打印出cmake运行的每一行脚本


  • cmake –trace-source= 打印出中运行的每一行脚本


1.6. 指定编译类型


-DCMAKE_BUILD_TYPE:Debug或Release或RelWithDebInfo

-DCMAKE_INSTALL_PREFIX: 指定安装路径,默认为/usr/local

-DBUILD_SHARED_LIBS: 是否编译共享库,ON or OFF

-DBUILD_TESTING: 是否编译tests



2. Do's and Don'ts


2.1. 不要做


  • 不要使用全局函数: link_directories, include_libraries等


  • 非必要不使用PULIBC限制


  • 不要用glob匹配文件:当新增文件时,除非重新跑一遍cmake, make或其他编译工具将不会感知到新文件


  • lib不要直接link到最终的target


  • link lib时不要忽略PUBLIC/PRIVATE关键字



2.2. 要做


  • 把cmake当做正经代码维护


  • 站在target的角度思考


  • 善用alias


  • 将通用功能抽象成函数或宏


  • 函数名统一小写


  • 善用cmake_policy



2.3. 选择cmake版本


2.3.1. os支持


  • 3.4: The bare minimum. Never set less.


  • 3.7: Debian old-stable.


  • 3.10: Ubuntu 18.04.


  • 3.11: CentOS 8 (use EPEL or AppSteams, though)


  • 3.13: Debian stable.


  • 3.16: Ubuntu 20.04.


  • 3.19: First to support Apple Silicon.


  • latest: pip/conda-forge/homebew/chocolaty, ect.


笔者目前用的是3.16



2.3.2. 特性


  • 3.8: C++ meta features, CUDA, lots more


  • 3.11: IMPORTED INTERFACE setting, faster, FetchContent, COMPILE_LANGUAGE in IDEs


  • 3.12: C++20, cmake --build build -j N, SHELL:, FindPython


  • 3.14/3.15: CLI, FindPython updates


  • 3.16: Unity builds / precompiled headers, CUDA meta features


  • 3.17/3.18: Lots more CUDA, metaprogramming



3. What's new in in CMake


  • cmake 3.0: interface libraries, 允许将一组头文件抽象成一个lib


  • cmake 3.1: 支持c++11和compile features


  • cmake 3.2: 支持UTF-8


  • cmake 3.4: 支持swift语言,支持ccache


  • cmake 3.5: 支持ARM平台


  • cmake 3.6: 支持clang-tidy


  • 其他:略




4. 基础知识


指定最小版本

cmake_minimum_required(VERSION 3.1)


创建工程

project(MyProject VERSION 1.0
                  DESCRIPTION "Very nice project"
                  LANGUAGES CXX)


新增executable

add_executable(one two.cpp three.h)


新增library

add_library(one STATIC two.cpp three.h)



用户可指定STATIC、SHARED、MODULE 。缺省使用BUILD_SHARED_LIBS选项。

INTERFAC用于创建头文件库


ALIAS用于指定库的别名.


绑定头文件路径

target_include_directories(one PUBLIC include)

PUBLIC表示所有依赖lib的target都自动绑定了该头文件路径

PRIVATE表示该头文件路径仅对本target有效


INTERFACE表示该头文件路径仅对依赖该lib的target生效

PUBLIC = PRIVATE + INTERFACE



5. 变量和cache


定义变量

set(MY_VARIABLE "value")

访问变量时使用${MY_VARIABLE}

变量仅在当前作用域内有效。


定义变量(多个值)

set(MY_LIST "one" "two")

等效于

set(MY_LIST "one;two")

属性

set_property(TARGET TargetName
             PROPERTY CXX_STANDARD 11)
set_target_properties(TargetName PROPERTIES
                      CXX_STANDARD 11)
get_property(ResultVariable TARGET TargetName PROPERTY CXX_STANDARD)



相关文章
|
人工智能 搜索推荐 大数据
EDM营销是什么意思?
EDM营销是什么意思?
|
SQL 存储 关系型数据库
SQL语言优缺点有哪些?
SQL(Structured Query Language)语言作为数据库管理和操作的标准语言,具有一系列的优点,同时也存在一些缺点。
384 7
一个简单的Vue2例子讲明白拖拽drag、移入dragover、放下drop的触发机制先后顺序
一个简单的Vue2例子讲明白拖拽drag、移入dragover、放下drop的触发机制先后顺序
|
JavaScript jenkins Devops
【DevOps】jekinsBuild step ‘Execute shell‘ marked build as failure
【DevOps】jekinsBuild step ‘Execute shell‘ marked build as failure
1754 1
|
人工智能 监控 Python
[AI Embedchain] 集成 Langsmith
[AI Embedchain] 集成 Langsmith
[AI Embedchain] 集成 Langsmith
|
自然语言处理 测试技术 编译器
社区供稿 | 姜子牙大模型开源代码大模型Ziya-Coding-34B-v1.0 再创榜单新高,魔搭开源可体验!
使用自然语言生成高质量的代码是大模型落地中的高频需求。近日,IDEA研究院封神榜团队正式开源最新的代码大模型Ziya-Coding-34B-v1.0,我们在HumanEval Pass@1的评测上,取得了75.5的好成绩,超过了GPT-4(67.0)的得分,也成为目前已知开源模型新高。
|
Linux 开发工具 数据安全/隐私保护
【Deepin 20 系统】error:driver pcspkr is already registered aborting
解决Deepin 20系统启动时遇到的“error: driver pcspkr is already registered aborting”错误的方法,通过在GRUB引导加载器中临时更改启动选项进入多用户文本模式,并在系统中创建一个黑名单文件来禁用pcspkr驱动。
790 2
|
JavaScript 前端开发 IDE
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
333 1
QT实现一个简单的日志打印系统
QT实现一个简单的日志打印系统
419 0
|
数据可视化 数据挖掘 关系型数据库
招聘信息数据分析及可视化|以51JOB为例进行
招聘信息数据分析及可视化|以51JOB为例进行
736 0