CMake构建实战:项目开发卷 程序设计程序C++构建makefile计算机编程软件开发书籍
运费: | ¥ 0.00-20.00 |
商品详情
定价:99.8
ISBN:9787115616647
作者:许宏旭
版次:第1版
出版时间:2024-02
内容提要:
本书主要介绍C和C++程序构建的相关知识,包括直接调用C和C++编译器完成构建的基础内容,以及使用CMake完成项目构建的相关内容。全书先介绍市面上C和C++的主流编译器及其相关命令行工具、Makefile等的使用,抽象出与项目构建相关的概念模型,再介绍CMake脚本语言的基础语法、常用命令等,*介绍与CMake项目构建相关的内容。本书含有两个实践章节,借助CMake脚本语言,分别构建了快速排序算法程序、手写数字识别库及配套命令行工具。 本书适合有C和C++编程基础,希望了解或应用CMake工具的人阅读,也适合想要构建跨平台C和C++程序的开发人员阅读。
作者简介:
许宏旭,*软件工程师,曾*职于微软(亚洲)互联网工程院,从事自然语言处理等相关工程研发工作,参与过Bing搜索引擎、Office 365等大型项目,具有多年使用CMake组织C++复杂项目的开发经验。
目录:
第 1 章 构建之旅...1
1.1 单源文件程序:您好,世界!...1
1.2 构建多源程序...3
1.2.1 输出另一源程序的字符串...3
1.2.2 一个需要漫长编译过程的程序...3
1.2.3 按需编译:快速构建变更...4
1.2.4 使用 Makefile 简化构建...7
1.3 构建静态库...9
1.4 构建动态库...12
1.4.1 Windows 中动态链接的原理...13
1.4.2 Linux 中动态链接的原理...17
1.5 引用第三方库...22
1.5.1 下载 Boost C++库...22
1.5.2 引用 Boost C++头文件库...22
1.5.3 安装 Boost C++库...24
1.5.4 链接 Boost C++库...25
1.6 旅行笔记...29
1.6.1 构建的基本单元:源程序...29
1.6.2 核心的抽象概念:构建目标...30
1.6.3 目标属性...31
1.6.4 使用要求的传递性...34
1.6.5 目录属性...40
1.6.6 自定义构建规则...40
1.6.7 尾声...41
第 2 章 CMake 简介...42
2.1 为什么使用 CMake...43
2.1.1 平台无关和编译器无关...43
2.1.2 开源自由和*的社区生态...44
2.1.3 强大通用的脚本语言...44
2.1.4 稳定地向后兼容...44
2.1.5 持续不断地改进和新特性...45
2.2 安装 CMake...45
2.2.1 在 Windows 中安装 CMake...45
2.2.2 在 Linux 中安装 CMake...46
2.2.3 在 macOS 中安装 CMake...47
2.3 您好,CMake!...48
第 3 章 基础语法...49
3.1 CMake 程序...49
3.1.1 目录程序(CMakeLists.txt)...50
3.1.2 脚本程序(<script>.cmake)...50
3.1.3 模块程序(<module>.cmake)...50
3.2 注释...50
3.2.1 单行注释...50
3.2.2 括号注释...50
3.3 命令调用...51
3.4 命令参数...51
3.4.1 引号参数...51
3.4.2 非引号参数...52
3.4.3 变量引用...53
3.4.4 转义字符...53
3.4.5 括号参数...55
3.5 变量...56
3.5.1 预定义变量...57
3.5.2 定义变量...57
3.6 列表...62
3.7 控制结构...64
3.7.1 if 条件分支...64
3.7.2 while 判断循环...65
3.7.3 foreach 遍历循环...65
3.7.4 跳出和跳过循环:break 和
continue...68
3.8 条件语法...69
3.8.1 常量、变量和字符串条件...69
3.8.2 逻辑运算...71
3.8.3 单参数条件...71
3.8.4 双参数条件...73
3.8.5 括号和条件优先级...75
3.8.6 变量展开...75
3.9 命令定义...77
3.9.1 宏定义...78
3.9.2 函数定义...78
3.9.3 参数的访问...79
3.9.4 参数的设计与解析...80
3.9.5 宏和函数的区别...86
3.10 小结...88
第 4 章 常用命令...89
4.1 数值操作命令:math...89
4.2 字符串操作命令:string...90
4.2.1 搜索和替换...90
4.2.2 正则匹配和替换...91
4.2.3 取字符串长度...96
4.2.4 字符串变换...96
4.2.5 比较字符串...98
4.2.6 取哈希值...98
4.2.7 字符串生成...99
4.2.8 字符串模板...103
4.2.9 JSON 操作...107
4.3 列表操作命令:list...111
4.3.1 回顾列表...111
4.3.2 访问列表元素...112
4.3.3 获取列表长度...113
4.3.4 列表元素增删...113
4.3.5 列表变换...114
4.3.6 列表重排...115
4.3.7 列表元素变换...117
4.4 文件操作命令:file...118
4.4.1 读取文件...118
4.4.2 取运行时依赖...121
4.4.3 写入文件...125
4.4.4 模板文件...125
4.4.5 遍历路径...126
4.4.6 移动文件或目录...128
4.4.7 删除文件或目录...128
4.4.8 创建目录...129
4.4.9 拷贝文件或目录...129
4.4.10 文件传输...133
4.4.11 锁定文件...135
4.4.12 归档压缩...136
4.4.13 生成文件...137
4.4.14 路径转换...139
4.5 路径操作命令:cmake_path...140
4.5.1 路径结构...140
4.5.2 创建路径变量...141
4.5.3 分解路径结构...142
4.5.4 路径判别...143
4.5.5 比较路径...145
4.5.6 路径修改...146
4.5.7 路径转换...147
4.6 路径操作命令:get_filename_component...149
4.6.1 分解路径结构...149
4.6.2 解析命令行...150
4.7 配置模板文件:configure_file...150
4.8 日志输出命令:message...152
4.8.1 输出日志...153
4.8.2 筛选日志级别...157
4.8.3 输出检查状态...158
4.8.4 设置输出格式...159
4.9 执行程序:execute_process...161
4.9.1 管道输出...161
4.9.2 并行执行...162
4.9.3 子进程继承环境变量...163
4.9.4 设置工作目录...163
4.9.5 获取进程返回值...163
4.9.6 设置*时时长...164
4.9.7 设置输出变量...164
4.9.8 设置输入输出文件...165
4.9.9 屏蔽输出...166
4.9.10 删除输出尾部空白...166
4.9.11 输出命令行调用...166
4.9.12 设置输出编码...167
4.9.13 设置失败条件...167
4.9.14 解析命令行参数:separate_arguments...167
4.10 引用 CMake 程序:include...169
4.10.1 引用 CMake 程序...169
4.10.2 引用卫哨:include_guard...170
4.11 执行代码片段:cmake_language...172
4.11.1 调用命令...172
4.11.2 执行代码...173
4.11.3 延迟调用命令...174
4.12 监控变量:variable_watch...176
4.12.1 实例...177
第 5 章 实践:CMake 快速排序...179
第 6 章 CMake 构建初探...181
6.1 CMake 项目的生命周期...181
6.1.1 配置阶段和生成阶段...181
6.1.2 构建阶段...184
6.1.3 安装阶段和打包阶段...186
6.1.4 程序包安装阶段...187
6.2 项目配置与缓存变量...189
6.2.1 使用 CMake GUI 配置缓存变量...190
6.2.2 常用缓存变量...191
6.2.3 标记缓存变量为*配置:mark_as_advanced...192
6.3 CMake 命令行的使用...193
6.3.1 配置和生成...193
6.3.2 构建...194
6.3.3 打开生成的项目...195
6.3.4 安装...195
6.3.5 内置命令行工具...196
6.4 使用 Visual Studio 打开 CMake 项目...200
6.4.1 生成 Visual Studio 的原生解决方案...200
6.4.2 使用 Visual Studio 直接打开
CMake 项目...201
6.5 小结...202
第 7 章 构建目标和属性...203
7.1 二进制构建目标...203
7.1.1 可执行文件目标...203
7.1.2 一般库目标...205
7.1.3 目标文件库目标...207
7.1.4 指定源文件的方式...207
7.2 伪构建目标...208
7.2.1 接口库目标...208
7.2.2 导入目标...209
7.2.3 别名目标...212
7.3 子目录...213
7.3.1 加入子目录:add_subdirectory...213
7.4 项目:project...214
7.4.1 代码注入...214
7.5 属性:get_property、set_property...215
7.5.1 全局属性...215
7.5.2 目录属性...217
7.5.3 目标属性...219
7.5.4 源文件属性...222
7.5.5 缓存变量属性...224
7.5.6 构建中常用的属性...225
7.5.7 自定义属性:define_property...228
7.6 属性相关命令...229
7.6.1 设置目标链接库:
target_link_libraries...229
7.6.2 PUBLIC、INTERFACE、PRIVATE
与传递性...232
7.6.3 设置宏定义:
add_compile_definitions...233
7.6.4 设置目标宏定义:
target_compile_definitions...234
7.6.5 设置编译参数:add_compile_ options...234
7.6.6 设置目标编译参数:target_compile_options...234
7.6.7 设置目标编译特性:target_compile_features...234
7.6.8 设置头文件目录:include_ directories...235
7.6.9 设置目标头文件目录:target_include_directories...235
7.6.10 设置链接库:link_libraries...236
7.6.11 设置链接目录:link_ directories...236
7.6.12 设置目标链接目录:target_link_directories...236
7.6.13 设置链接参数:add_link_options...236
7.6.14 设置目标链接参数:target_link_options...237
7.6.15 设置目标源文件:target_sources...237
7.6.16 无须递归传递的例程...237
7.6.17 存在间接引用的例程...238
7.7 自定义构建规则:add_custom_ command...239
7.7.1 生成文件...239
7.7.2 响应构建事件...244
7.8 自定义构建目标:add_custom_target...245
7.9 设置依赖关系:add_dependencies...247
7.10 小结...248
第 8 章 生成器表达式...249
8.1 支持生成器表达式的命令...249
8.1.1 创建构建目标的命令...250
8.1.2 属性相关命令...251
8.1.3 自定义构建规则和目标...252
8.2 布尔型生成器表达式...253
8.2.1 转换字符串为布尔值:BOOL...253
8.2.2 逻辑运算...253
8.2.3 关系比较...254
8.2.4 谓词查询...255
8.3 字符串生成器表达式...258
8.3.1 字符转义...258
8.3.2 条件表达式:IF...258
8.3.3 字符串变换...259
8.3.4 目标相关表达式...260
8.3.5 解析生成器表达式...262
8.4 小结...263
第 9 章 模块...265
9.1 引用功能模块...265
9.2 常用的预置功能模块...265
9.2.1 用于调试的模块...265
9.2.2 用于检查环境的模块...267
9.2.3 用于生成导出头文件的模块:GenerateExportHeader...272
9.3 查找模块...276
9.3.1 查找软件包命令:find_package(模块模式)...276
9.3.2 实例:使用 FindThreads 引用线程库...278
9.3.3 实例:使用 FindBoost 引用Boost 库...278
9.4 编写自定义查找模块...281
9.4.1 查找文件:find_file...281
9.4.2 查找库文件:find_library...284
9.4.3 查找目录:find_path...286
9.4.4 查找可执行文件:find_program...286
9.4.5 与查找参数相关的变量...287
9.4.6 查找条件变量...289
9.4.7 查找结果变量...289
9.4.8 FindPackageHandleStandardArgs模块...290
9.4.9 实例:onnxruntime 的查找模块...292
9.5 小结...297
第 10 章 策略与向后兼容...298
10.1 CMake策略(以 CMP0115为例)...298
10.1.1 借助官方文档查阅 CMake 策略...298
10.2 指定 CMake *版本要求:cmake_minimum_required...299
10.2.1 *版本要求与策略设置...299
10.3 管理策略行为:cmake_policy...300
10.3.1 按策略名称设置策略行为...300
10.3.2 获取策略行为...300
10.3.3 按 CMake 版本设置策略行为...300
10.3.4 管理 CMake 策略栈...301
10.4 渐进式重构 CMake 程序...301
10.4.1 局部代码重构并启用新行为...302
10.4.2 禁用警告信息...302
10.4.3 同时兼容旧版 CMake...302
10.4.4 为全部策略采用新行为...303
10.4.5 完全切换到新版 CMake...303
10.5 小结...303
第 11 章 实践:基于 onnxruntime 的手写数字识别库...304
11.1 前期设计...304
11.1.1 模块设计...304
11.1.2 项目目录结构...304
11.1.3 接口设计...305
11.2 第三方库...307
11.2.1 安装 zlib 库...307
11.2.2 安装 libpng 库...307
11.2.3 libpng 的查找模块...308
11.3 CMake 目录程序...309
11.3.1 查找软件包...309
11.3.2 num_recognizer 动态库目标..310
11.3.3 recognize 可执行文件目标...310
11.4 代码实现...311
11.4.1 全局常量和全局变量...311
11.4.2 手写数字识别类...311
11.4.3 初始化接口实现...312
11.4.4 构造识别器接口实现...312
11.4.5 析构识别器接口实现...313
11.4.6 识别二值化图片像素数组接口实现...313
11.4.7 识别 PNG 图片接口实现...313
11.4.8 完善手写数字识别库的头文件(以同时支持 C 语言)...317
11.4.9 命令行工具的实现...319
11.5 构建和运行...320
11.6 小结...321
- 人民邮电出版社有限公司 (微信公众号认证)
- 人民邮电出版社微店,为您提供最全面,最专业的一站式购书服务
- 扫描二维码,访问我们的微信店铺
- 随时随地的购物、客服咨询、查询订单和物流...