实例学习写Makefile文件

目录程序员

  0. 扫盲
  1. 编译,连接
  2. Makefile文件执行
  3. Makefile书写规则
  4. 案例
  5. Makefile是如何工做的
  6. 拔高,参考spa

 

0. 扫盲3d

Linux 环境下的程序员若是不会使用GNU make来构建和管理本身的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员(是否是夸张了点,别人说的)。    code

什么是makefile文件?它是一个指挥文件,指挥着源文件编译的前后顺序,以及如何连接在一块儿。blog

 

1. 编译,连接get

 

2. Makefile文件执行编译器

写好Makefile(或写成makefile)文件后,直接执行命令make,编译器会自动执行makefile里的命令,进行编译、连接知道生成最终能够执行的文件。即编译

make

 

3. Makefile书写规则class

target : objects
    command

其中变量

  • target是能够是目标文件(.o)也能够是可执行文件,还能够是个标签(最后说)
  • objects是生成target依赖的文件
  • command是make要执行的文件(能够是任意Shell命令)
  • 特殊字符:$@:目标文件,$^:全部的依赖文件,$<:第一个依赖文件

 

4. 案例

假设文件的关系以下图

 

写法1

main2 : main2.o sum.o hello.o
    g++ -o main2  main2.o sum.o hello.o
main2.o : main2.cc sum.h
    g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
    g++ -c sum.cc
hello.o : hello.cc hello.h
    g++ -c hello.cc

参数 -o 后面是可执文件; -c后面是待编译的文件。在前两行中写了不少重复的.o文件,能够把它集合起来,用变量表示,以下:

 

写法2

objects = main2.o sum.o hello.o
main2 : $(objects)
    g++ -o main2 $(objects)

main2.o : main2.cc sum.h
    g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
    g++ -c sum.cc
hello.o : hello.cc hello.h
    g++ -c hello.cc

GUN的make至关强大,它能够自动推导文件集文件依赖关系,写法以下:

 

写法3

objects = main2.o sum.o hello.o
main2 : $(objects)
    g++ -o main2 $(objects)

main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h

文件执行完了之后生成不少.o文件,能不能能够删除掉,能够的,写上命令(例如clean),下面是执行的操做,例如:

 

写法4

objects = main2.o sum.o hello.o
main2 : $(objects)
    g++ -o main2 $(objects)

main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h

clean:
    rm *.o

这样执行 make clean,就会执行rm *.o 删除全部的.o文件,即

make clean

 

5. Makefile如何工做的?

  1. 输入make后,会在目录找Makefile、makefile
  2. 若是找到,它会在文件中找到第一个目标文件(例子中的main2)做为最终的目标文件
  3. 若是main2不存在,就依靠后边的.o文件生成
  4. 若是后边的.o不存在,就利用下边的g++ -c 生成
  5. .o文件都够了,就连接生成最终的目标文件

 

6. 拔高,参考

跟我一块儿写Makefile-陈皓

相关文章
相关标签/搜索