makefile
Make file
GNUmakefile 三种默认方法
make gmake编译 都可以编译上面
make 默认是找第一个目标
make clean 找clean这个目标
make -f mymk.mk
make -f mymk.mk clean
目标与依赖
目标: 依赖
编译指令
其中目标的名字是可以随便改的,下面的clean也是可以随便命名的,只是约定俗称这样写的
一般来说他可以产生目标,也可以不产生目标,
my.log: a.txt
cat a.txt > my.log
clean:
rm my.log
上面第一个target不产生文件,你多次执行是有一点问题的,主要文件是最新的(就是依赖文件是最新的的话,他就不会再执行这个命令)
下面
clean 是不产生target的,他可以多次执行这个命令,因为他不产生文件, 不用考虑
依赖文件更新文件
产生一系列指令
最终看的是,cpp文件的时间戳是否是最新的
一是没mubiao
二是 时间戳 依赖文件必目标更新
目标不存在,就一直可以执行
:w
一次性全部做完,不产生.o文件,就是上面不产生.o文件
g++ -o bin/make_test src/main.cpp src/sub1/dummy*.cpp src/sub2/dummy*.cpp -g -Wall -I inc , 这种就是不产生中间文件
-o是指定要产生的文件名 你不指定,他也会产生目标文件,但是他是在当前目录下产生的, -o是可以指定你在那个目录下产生目标文件
先看文件,在看文件产生的以来文件,下面
all: bin/make_test 这个文件
OBJS+= + 是防止覆盖
一般要加上小过好
在一个规则当中
../bin/make_test : $(OBJS)
g++ o $(@) $(^)
$@是指上面的目标文件make_test,^是指上面的$(OBJS)
./sub2/dummy4.o : ../src/sub2/dummy4.cpp
g++ g Wall o $(@) c $(<) I$(INC)
$@ 是上面的./sub2/dummy4.o,$(<)是上面的第一个依赖文件
用变量是精简代码
:0
递归查开一个目录下的所有文件是ls -R
ctrl+v ctrl+i
%无论什么时候,都会执行目标,
./PHONY: clean 是产生一个伪目标
@是销回符号,屏蔽符号
-是不中断程序的执行,
模块化编程,
就是同时有
include build/sub.mk
include build /sub/mke
make的6个版本
第一种是一般的完全展开写,
第二种是:替换个变量,将原来重复的东西给添加到一个变量中,然后让这个变量去表示
RM := rm rf
第三种是: $@ 和^ $<的 自动变量的使用,$@是目标文件,$^是所有的依赖文件,<是第一个依赖文件
g++ g Wall o $(@) c $(<) I$(INC)
第四种是:加为 Makefile 添加 .PHONY 标签 可以讲某目标当成伪目标
第五种是:Makefile 模块化,
Make file
GNUmakefile 三种默认方法
make gmake编译 都可以编译上面
make 默认是找第一个目标
make clean 找clean这个目标
make -f mymk.mk
make -f mymk.mk clean
目标与依赖
目标: 依赖
编译指令
其中目标的名字是可以随便改的,下面的clean也是可以随便命名的,只是约定俗称这样写的
一般来说他可以产生目标,也可以不产生目标,
my.log: a.txt
cat a.txt > my.log
clean:
rm my.log
上面第一个target不产生文件,你多次执行是有一点问题的,主要文件是最新的(就是依赖文件是最新的的话,他就不会再执行这个命令)
下面
clean 是不产生target的,他可以多次执行这个命令,因为他不产生文件, 不用考虑
依赖文件更新文件
产生一系列指令
最终看的是,cpp文件的时间戳是否是最新的
一是没mubiao
二是 时间戳 依赖文件必目标更新
目标不存在,就一直可以执行
:w
一次性全部做完,不产生.o文件,就是上面不产生.o文件
g++ -o bin/make_test src/main.cpp src/sub1/dummy*.cpp src/sub2/dummy*.cpp -g -Wall -I inc , 这种就是不产生中间文件
-o是指定要产生的文件名 你不指定,他也会产生目标文件,但是他是在当前目录下产生的, -o是可以指定你在那个目录下产生目标文件
先看文件,在看文件产生的以来文件,下面
all: bin/make_test 这个文件
OBJS+= + 是防止覆盖
一般要加上小过好
在一个规则当中
../bin/make_test : $(OBJS)
g++ o $(@) $(^)
$@是指上面的目标文件make_test,^是指上面的$(OBJS)
./sub2/dummy4.o : ../src/sub2/dummy4.cpp
g++ g Wall o $(@) c $(<) I$(INC)
$@ 是上面的./sub2/dummy4.o,$(<)是上面的第一个依赖文件
用变量是精简代码
:0
递归查开一个目录下的所有文件是ls -R
ctrl+v ctrl+i
%无论什么时候,都会执行目标,
./PHONY: clean 是产生一个伪目标
@是销回符号,屏蔽符号
-是不中断程序的执行,
模块化编程,
就是同时有
include build/sub.mk
include build /sub/mke
make的6个版本
第一种是一般的完全展开写,
第二种是:替换个变量,将原来重复的东西给添加到一个变量中,然后让这个变量去表示
RM := rm rf
第三种是: $@ 和^ $<的 自动变量的使用,$@是目标文件,$^是所有的依赖文件,<是第一个依赖文件
g++ g Wall o $(@) c $(<) I$(INC)
第四种是:加为 Makefile 添加 .PHONY 标签 可以讲某目标当成伪目标
第五种是:Makefile 模块化,