前言
跨平台的c&c++开发离不开cmake。
各个平台下都有自己的make工具
GUN:Make
微软:MSBuild、NMake
BSD:Make
Cmake允许开发者编写平台无关的CMakeList.txt 文件来定制整个编译流程。然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。
职责是生成可编译项目,不进行编译。
使用
手册:
https://www.zybuluo.com/khan-lau/note/254724
单个源文件
|
|
由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
多个源文件
|
|
可以直接在add_executable中添加。
添加目录下所有文件:
aux_source_directory(< dir> < variable>):该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。
多目录
每个目录各放一个CMakeLists.txt
可以每个目录里的文件编译为静态库
根:
子:
add_library:将源文件编译为静态链接库。
编译选项
这些编译选项可以被cmake识别
configure_file用于根据配置生成头文件。
option:添加选项
选项可用在cmake时传入或者可视化选择
添加第三方依赖
使用:
只写库名就可以,就是libxxx.so的中间xxx的部分
或者直接用add_library、find_library
常见函数
具体用法可在:
https://www.zybuluo.com/khan-lau/note/254724
手册上查找
脚本指令:
Cmake指令
|
|
生成器:可以生成的目标平台工程
集成开源库的方式
本地连编
基于cmake的本地连编,依据第三方库的编译形式分类:
第三方使用cmake时:
集成第三方cmake文件在自己的cmake结构树中。
第三方使用自己的分发脚本时:如ffmpeg
一般自己的分发脚本还需要执行环境,所以还需要将其环境集成到项目中
难于集成环境时可以预先将其按不同平台分发后拉取,在本地仅做编译
第三方无平台分发或不跨平台:如wtl
直接自己写cmake文件集成,分平台控制即可
远端包依赖管理
类似maven、linux包管理-不过这种都是二进制包管理
注意模块间不要循环依赖,应该是树形依赖
简单基于cmake完成包管理:
https://github.com/imbaya2466/cmakeDependencyManagement
这种实现是非常不适合c/c+++的,因为各种平台、系统、win的(MT、MTD、MD、MDd)、debug、release…..
这种交叉形成的种类根本不可能用二进制管理。
因此必须本地联编,而本地连编+远端依赖管理=下拉源码本地编译
那怎么解决呢。。。。
神器:Vcpkg!!!!!!!!
官方库+自定义下拉+自定义cmake编译脚本=自定义远端依赖源码本地联编
https://github.com/microsoft/vcpkg
https://blog.csdn.net/cjmqas/article/details/79282847
经测试,即使是ffmpeg这样复杂的环境也可以在win上编译
使用杂记
cmake中的list就是每个项用;分割