makefile和CMakeLists/C++包管理器
make
-
大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢?
-
我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模型可以很好的利用这个工具。而cmake的原理就是自动生成makefile,所以还是很值得学习makefile,了解历史的。
-
makefile和CMakeLists
- 当只是编写一个文件的代码时,直接使用命令运行很方便。但是一但项目复杂起来后,就会难以管理,这个时候使用自动化构建工具就会十分方便,常用的构建工具有make和Cmake。make通过makefile对项目进行管理。Cmake通过配置生成适应各操作系统版本的makefile文件有着很好的跨平台性。
一、makefile
-
简单的编译运行命令(g++为例C++,g++会自动连接依赖库,适用于C++)
g++ <依赖文件> -o <目标文件>
-
makefile的规则
<目标文件> : <依赖文件>
<要执行的命令>
hello: main.c message.c gcc main.c message.c -o hello
-
makefile特征
-
makefile的扩展名是.mk,但是创建的时候直接忽略就好
-
执行的命令前面必须是tab键
-
实际情况应该是先编译后再链接,推荐此种写法
-
伪目标:不生成目标文件的目标,只是一个标签,最常用的就是clean和all,clean常用来产生的临时文件
-
伪目标注意:
-
不要和文件名重复,因为伪目标运行的时候是
make <伪目标>
这样的格式,而也有这种类型的命令make <file>
来指定目标的生成,所以如果伪目标和文件名重复,则会冲突 -
解决方案,在开头加上
.PHONY: <伪目标>
,来显示告诉编译器,这就是个伪目标 -
当需要同时执行多个可执行文件的生成的时候就可以使用all伪目标,格式伪
all: <目标文件> <目标文件>
,当然把all放在除.PHONY: <伪目标>
之后,make直接执行默认也是为目标所指定的所有目标文件
-
-
同一种规则和依赖文件的简化写法
-
禁止执行的命令行输出打印在终端上
在对应命令加上@就好
-
使用变量,常常讲一些命令行参数以及源文件、目标文件、编译文件使用变量定义
-
特殊符号,常说$<其它特殊符号组成>
$@
代表目标文件$<
代表第一个依赖文件$^
代表所有依赖文件 -
通配符:所有的cpp文件和o文件
-
更多的分支循环
-
-
-
-
make
-
make是按照时间戳来判断是否更新目标文件的,若时间戳不变则无法改变,下图为windows系统,与mac和linux有些许差异
-
如何运行伪目标
make <伪目标>
-
参数
-
-f参数指定makefile的文件,可以修改makefile的名称,使用的时候加上-f指向修改好的文件就好
-
-n参数打印出要执行的命令,但不会执行,常用来用来调试
-
-C参数调用子模块的makefile
-
-
二、cmake中的CMakeLists
-
基本写法
cmake_mininum_required(VERSION 3.10)//最小版本指定 project(HelloWorld)//项目名字 set(Source main.c)//定义变量 add_executable(hello ${Source}) //`<目标文件> : <依赖文件>` // `<要执行的命令>`
-
优势:
- 跨平台性、跨编译器
-
其它功能:指定编译选项、链接库、生成静态库、动态库等等
- 大家应该会很奇怪,前面都说cmake好了,要学习,为什么就讲了这么点内容,我觉得学习这些基础的框架就够了,其它的依靠大模型的帮助会更有性价比。这里可能大家觉得我有些双标,我觉得工具的魅力是它的底蕴,是需要了解它,但是真正用到实际的时候,还是好的漂亮的代码最棒。大模型的代码比大部分写的代码都要合理,因为其训练数据种包含着拥有无数高质量代码的github。