使用步骤
1) 编写
- 创建 makefile 文件
vim makefile
用 vim 打开名为 makefile 的文件,存在该文件则打开编辑,不存在则创建并打开.
- 在 makefile 文件中编写需要编译的文件
test:test.cpp
g++ -o test test.cpp
第一行:
冒号左侧为编译后的可执行文件名,可以随便取.
冒号右侧为依赖关系列表,写上编译可执行文件需要的源文件即可, 如果依赖多个源文件用空格隔开即可, 不需要加上头文件,因为头文件会在包含了其的头文件内展开.
第二行(开头一定要加一个 tab, 语法规则):
编译的 .C 文件就用 gcc, .cpp 文件就用 g++, -o 后面接编译生成的可执行文件的名称,和冒号左边保持一致,最后加上依赖文件,就平常编
译文件怎么写,这里就怎么写.
这里第二行的 test 可以用 $@ 代替,表示 : 左边是什么,这里就是什么, test.cpp 依赖文件这里可以用 $^ 代替,表示 : 右侧的依赖文件
列表是什么,这里就是什么,在依赖文件列表存在多个依赖文件时,可以大大提高编写效率.
3.编写清理操作
clean:
rm -rf test
第一行:
删除不需要依赖任何文件, 直接写 clean: 就行, 冒号左边也可以自定义名称, 建议就写 clean, 顾名思义挺好的.
第二行(开头一定要加一个 tab, 语法规则):
简单的一个删除指令,上一步生成的可执行文件叫啥就删啥,注意只删除可执行文件,别把源文件也删除了!
- .PHONY
.PHONY:clean
clean:
rm -rf test
.PHONY: 后面加上自定义的名称, 注意与第二行的名称保持一致,表示始终可以执行该指令.
5.简单完整makefile代码
test:test.cpp
g++ -o test test.cpp
.PHONY:clean
clean:
rm -rf test
2) 使用
编写好 makefile 后, 输入指令 make 即可开始编译, 编译成功后会生成自定义名称的可执行文件.
如图, make 之后会自动执行依赖方法生成可执行文件, 需要清理可执行文件输入 make clean 即可.
make clean 可以始终执行, 即:
但是 make 不行, 编译成功一次后, 再 make 的话会出现如下情况:
它会提示 ‘test’ 是最新的, 这是为了防止重复编译, 因为如果在一个大项目中, 编译一次是很慢的, 如果目前的可执行文件是最新的, 就没有必要再编译一次了, 如何判断可执行文件是最新的呢? 很简单, 比较源文件的最后修改时间和生成的可执行文件的最后修改时间即可, 如果可执行文件的最后修改时间大于源文件的最后修改时间, 那么此时生成的可执行文件一定是最新的, 那么就禁止重新编译, 而如果此时的源文件的最后修改时间大于可执行文件的最后修改时间, 表示源文件有修改, 此时就允许再次编译.
随便修改一下源文件, 此时就可以再次编译了.
如果不想通过修改源文件来使能够再次编译, 也可以通过 touch 指令来使能够再次编译.
如果文件不存在, 那么 touch 就是用来创建一个文件, 如果一个文件已经存在, 那么再 touch 就是将该文件的 Access, Modify, Change 时间都变为最新的.
除此之外还可以通过设置 .PHONY 来让编译始终可以执行, 在 makefile 文件中加上:
.PHONY:test //加上这一句
test:test.cpp
g++ -o test test.cpp
.PHONY:clean
clean:
rm -rf test
此时就可以无视时间, 无限 make 了.
补充
为什么清理要写 make clean, 要加上 clean, 而编译直接就写 make 就好不用加上后缀呢?
其实也没什么特别的, 就是 makefile 规定谁在前就默认执行谁, 如果把清理写在前面, 那么直接输入 make 就会执行清理操作, 而编译就需要写为 make xxxx.
makefile 中这么写:
.PHONY:clean
clean:
rm -rf test
test:test.cpp
g++ -o $@ $^
执行就是这样的:
此时直接输入 make 就是清理操作了, 而编译需要加上可执行文件名.