【Linux】makefile的编写

昨天把程序移植到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键之后) ,标记为不管命令出不出错都认为是成功的,这样命令会继续执行下去

猜你喜欢

转载自blog.csdn.net/Ethan95/article/details/84844305