gcc hello.cpp div.cpp sub.cpp add.cpp -o hello
在自己的工程中,可能需要上述这样的编译依赖,但是每次编译,都会把原来的文件都重新编译加入到目标文件中
gcc 四步骤:生成 .o 文件比较耗时(汇编阶段)
上面的编译步骤其实就是省略了编译四步骤,假设现在我改了一个文件,需要重新编译,那么每次都会重新生成 .o 文件,因此需要把上面的步骤进行拆分
gcc -c sub.cpp -o sub.o
gcc -c add.cpp -o add.o
gcc -c div.cpp -o div.o
gcc -c hello.cpp -o hello.o
gcc add.o sub.o div.o hello.o -o hello
适合需要大批量文件编译。
2.1 一个规则
make语法
目标:依赖条件
(一个tab缩进) 命令
- 若想要生成目标文件,会检查规则中的依赖是否存在,如果不存在,则寻找是否有完整的规则来生成该依赖条件
- 会检查规则中的目标是否需要更新,必须先检查它所有依赖项,依赖中任一个被更改,则目标必须更新 (原理就是检测更新时间),节省了重新编译的开支
如
#先决条件,找到了依赖条件,并且下面有Tab符,则执行下面的gcc,并且加入是否重新编译判断
sub.o:subcpp
gcc -c sub.cpp -o sub.o
2.2 两个函数
src = $(wildcard *.cpp)
#找到当前目录下所有后缀为 .cpp 的文件,然后赋值给 src
obj = $(patsubst %cpp,%o,$(src))
#就是把src变量里的所有后缀为 .cpp 的文件替换成 .o 文件
make clean -n 注意加上 -n 预执行
#make clean会执行Makefile中配置的clean对应命令
如:
make clean
#makefile
clean:
rm -rf $(obj) hello.out
2.3 三个自动变量
$@:表示规则中的目标
$^ :表示规则中所有的依赖条件,组成一个列表,以空格隔开,如果这个列表有重复项则消除重复
$< : 表示规则中的第一个依赖条件,如果运行在模式套用中,相当于依次取出依赖条件套用该模式规则
以这个为例
sub.o:subcpp
gcc -c sub.cpp -o sub.o
$< 指的o:sub.cpp;$^ 如果有多个依赖条件,则多个的合集;$@这里指的sub.o
src = $(wildcard *.cpp)
obj = $(patsubst %cpp,%o,$(src))
# 可改写为
hello.out:$(obj)
gcc $^ -o $@
div.o:div.cpp
gcc -c $< -o $@
add.o:add.cpp
gcc -c $< -o $@
sub.o:sub.cpp
gcc -c $< -o $@
hello.o:hello.cpp
gcc -c $< -o $@
# 模式规则
# gcc -c $(src) -o $(obj)
# %o:%cpp
# gcc -c $< -o %@
# $(xxx) 取变量的值
clean:
rm -rf $(obj) hello.out
# 防止在makefile目录下有clean文件夹无法执行lean命令,https://blog.csdn.net/derkampf/article/details/70256891
.PHONY: clean
网友评论