昨天把程序移植到linux改了bug以后,感觉好麻烦
每次编译都要输那么长一堆命令,容易输错,而且没有变的源代码也顺便重新编译了一次,很浪费时间。
当时用了别名,发现不能实现需求。
嗯,学一学makefile怎么写
基本语法
target : prerequisites
<tab> command
- target:目标文件/执行文件/标签
- prerequisites:生成target需要的依赖
- command:需要执行的命令
依赖关系说明了目标文件是由哪些文件生成的,换句话说,如果后面被依赖的文件更新了,则目标文件需要重新生成。
如果prerequisites的日期比target新,或者target不存在,就执行command
command行的开头必须是<tab>
。
示例
用自己的项目做示例吧
我的项目里面的头文件包括
- leptException.h
- leptParser.h
- leptValue.h
源文件包括
- leptParser.cpp
- leptValue.cpp
- test.cpp
依赖关系如下:
- leptValue.cpp包含了源文件leptValue.h和leptParser.h
- leptParser.cpp包含了leptParser.h和leptException.h
- test.cpp包含了所有头文件
OBJS = test.o leptParser.o leptValue.o
g11 = g++ -std=c++11 -g -Wall
main : ${OBJS}
g++ -std=c++11 -g -Wall -o main ${OBJS} /usr/local/lib/libgtest.a -lpthread
test.o : test.cpp leptValue.h leptParser.h leptException.h
${g11} -c test.cpp
leptParser.o : leptParser.cpp leptParser.h leptException.h
${g11} -c leptParser.cpp
leptValue.o : leptValue.cpp leptValue.h leptParser.h
${g11} -c leptValue.cpp
.PHONY: clean
clean :
-rm main ${OBJS}
上面的工作过程:
- make在当前路径下找makefile文件
- 寻找文件中第一个target,作为最终的目标文件
- 如果main不存在,或者依赖更新,则生成main
- 如果依赖的也不存在,比如test.o,则去找目标test.o,并根据command去生成
clean后面没有依赖,所以不会自动执行。
变量
前两行的是变量,省得要不停的写一串东西
定义方式就是xxx=...
。
引用方式是${xxx}
或者$(xxx)
自动推导
make的自动推导好像不太好用,因为我自己还加了一堆参数,推导不出来,这里就不介绍了,这篇文章里写了。makefile介绍
清空文件
如果当前文件夹下有一个文件叫clean,则后面的command是不会执行的,因为clean已经存在,而且没有依赖。
声明为伪目标后,make就不会检查而是每次都执行了
为了忽略命令的出错,我们可以在Makefile的命令行前加一个减号 - (在Tab键之后) ,标记为不管命令出不出错都认为是成功的,这样命令会继续执行下去