没有合适的资源?快使用搜索试试~ 我知道了~
首页CMake实践:构建现代软件的利器
CMake实践:构建现代软件的利器
需积分: 50 5 下载量 16 浏览量
更新于2024-07-09
收藏 272KB PDF 举报
"CMake Practice.pdf 是一本47页的中文指南,旨在帮助读者掌握CMake这一构建工具的实践应用。作者Cjacker指出,CMake因在KDE4项目中的广泛应用而受到广泛关注,其优势在于项目的构建管理和大项目的支持。随着KDE从autotools迁移到cmake的成功,以及CMake在QT-4.3中的使用,CMake的实用性得到了进一步验证。然而,官方文档的不足和错误促使作者编写了这份教程《Cmake实践》(CmakePractice)。 教程内容包括作者在学习CMake过程中的笔记和实践经验,虽然可能有错误或理解不深入的地方,但旨在提供一个实用的学习资源。例如,作者提到官方文档中关于Find<Name>模块的错误,指出模块名称与后续定义不一致,这可能导致问题。此外,作者还提出了对CMake变量引用方式的一个疑问,即为何在大部分情况下需要使用${}引用变量,而在IF语句中则直接使用变量名。后来,作者从CMake的邮件列表中找到了部分解答,了解到`IF(var)`命令期望`var`是变量的名称,这一点已在CMake文档中明确说明。 本教程适合已经开始接触CMake并且希望深化理解和应用的开发者阅读,它不仅包含基础概念和用法,还分享了作者在实践中遇到的问题和解决方案,对于想要精通CMake的人来说是一份宝贵的参考资料。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/35074540/bg9.jpg)
FATAL_ERROR,立即终止所有 cmake 过程.
我们在这里使用的是 STATUS 信息输出,演示了由 PROJECT 指令定义的两个隐式变量
HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR。
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中
定义的源文件列表, 本例中你也可以直接写成 ADD_EXECUTABLE(hello main.c)。
在本例我们使用了${}来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比
如在 IF 控制语句,变量是直接使用变量名引用,而不需要${}。如果使用了${}去应用变
量,其实 IF 会去判断名为${}所代表的值的变量,那当然是不存在的了。
将本例改写成一个最简化的 CMakeLists.txt:
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)
4,基本语法规则
前面提到过,cmake ”其实仍然要使用 cmake ”语言和语法 去构建,上面的内容就是所谓的
”cmake ”语言和语法 ,最简单的语法规则是:
1,变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
2,指令(参数 1 参数 2...)
参数使用括弧括起,参数之间使用空格或分号分开。
以上面的 ADD_EXECUTABLE 指令为例,如果存在另外一个 func.c 源文件,就要写成:
ADD_EXECUTABLE(hello main.c func.c)或者
ADD_EXECUTABLE(hello main.c;func.c)
3,指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。
上面的 MESSAGE 指令我们已经用到了这条规则:
MESSAGE(STATUS “This is BINARY dir” ${HELLO_BINARY_DIR})
也可以写成:
MESSAGE(STATUS “This is BINARY dir ${HELLO_BINARY_DIR}”)
这里需要特别解释的是作为工程名的 HELLO 和生成的可执行文件 hello 是没有任何关系的。
hello 定义了可执行文件的文件名,你完全可以写成:
ADD_EXECUTABLE(t1 main.c)
![](https://csdnimg.cn/release/download_crawler_static/35074540/bga.jpg)
编译后会生成一个 t1 可执行文件。
5,关于语法的疑惑
cmake 的语法还是比较灵活而且考虑到各种情况,比如
SET(SRC_LIST main.c)也可以写成 SET(SRC_LIST “main.c”)
是没有区别的,但是假设一个源文件的文件名是 fu nc.c(文件名中间包含了空格)。
这时候就必须使用双引号,如果写成了 SET(SRC_LIST fu nc.c),就会出现错误,提示
你找不到 fu 文件和 nc.c 文件。这种情况,就必须写成:
SET(SRC_LIST “fu nc.c”)
此外,你可以可以忽略掉 source 列表中的源文件后缀,比如可以写成
ADD_EXECUTABLE(t1 main),cmake 会自动的在本目录查找 main.c 或者 main.cpp
等,当然,最好不要偷这个懒,以免这个目录确实存在一个 main.c 一个 main.
同时参数也可以使用分号来进行分割。
下面的例子也是合法的:
ADD_EXECUTABLE(t1 main.c t1.c)可以写成 ADD_EXECUTABLE(t1
main.c;t1.c).
我们只需要在编写 CMakeLists.txt 时注意形成统一的风格即可。
6,清理工程:
跟经典的 autotools 系列工具一样,运行:
make clean
即可对构建结果进行清理。
7,问题?问题!
“我尝试运行了 make distclean,这个指令一般用来清理构建过程中产生的中间文件的,
如果要发布代码,必然要清理掉所有的中间文件,但是为什么在 cmake 工程中这个命令是
”无效的?
是的,cmake 并不支持 make distclean,关于这一点,官方是有明确解释的:
因为 CMakeLists.txt 可以执行脚本并通过脚本生成一些临时文件,但是却没有办法来跟
踪这些临时文件到底是哪些。因此,没有办法提供一个可靠的 make distclean 方案。
Some build trees created with GNU autotools have a "make
distclean" target that cleans the build and also removes Makefiles
and other parts of the generated build system. CMake does not
generate a "make distclean" target because CMakeLists.txt files
can run scripts and arbitrary commands; CMake has no way of
tracking exactly which files are generated as part of running
剩余46页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/f1efeb290b344eccb74979477c2d3f14_woshixuexizhe10.jpg!1)
pthread_life
- 粉丝: 5
- 资源: 7
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)