makefile

Makefile

将gcc要执行的命令写到Makefile文件中
make在当前目录下查找Makefile文件,按Makefile中定义的规则,一层层查找依赖关系,执行相应的命令,编译生成最终的目标文件
默认的终极目标是第一个规则的目标
除了makefile的终极目标文件所在的规则外,其他规则的编写顺序任意
make会检查每一个target和它所依赖的文件的新旧关系,来确定要不要更新(即重新执行命令,重新进行编译)
当发现makefile中目标文件不存在或者目标文件所依赖的文件比目标文件新,就会执行后面的命令,来进行更新

1 mytool:main.o tool1.o tool2.o# 目标和依赖项
2     g++ main.o tool1.o tool2.o -o mytool # 得到目标需要执行的命令
3 main.o:main.cpp# 目标和依赖项
4     g++ main.cpp -c -o main.o
5 tool1.o:tool1.cpp# 目标和依赖项
6     g++ tool1.cpp -c -o tool1.o
7 tool2.o:tool2.cpp# 目标和依赖项
8     g++ tool2.cpp -c -o tool2.o
9
10 clean:
11     rm *.o mytool -rf

makefile中的变量都是字符串,类似C中的宏
进行简化

  1 tmp=main.o tool1.o tool2.o
  2 CC=g++					# CC 的默认值是 gcc
  3 CFLAGS=-c -o
  4 
  5 mytool:$(tmp) # 依赖关系
  6     $(CC) $(tmp) -o mytool
  7 
  8 main.o:main.cpp
  9     $(CC) main.cpp $(CFLAGS) main.o
 10 tool1.o:tool1.cpp
 11     $(CC) tool1.cpp $(CFLAGS) tool1.o
 12 tool2.o:tool2.cpp
 13     $(CC) tool2.cpp $(CFLAGS) tool2.o
 14 
 15 clean:
 16     rm *.o mytool -rf
# = 是最新的值 
# :=  是当前赋予的值 
# ?= 如果变量还没被赋值,则进行赋值。否则使用 前面赋的值

进一步简化

  1 tmp=main.o tool1.o tool2.o
  2 CFLAGS=-c -o
  3 
  4 mytool:$(tmp)               # 依赖关系
  5     $(CC) $^ -o $@			# $^ 是上一行中所有的依赖文件,$(tmp)
  6 							# $@ 是上一行中目标文件
  7 main.o:main.cpp				# $< 第一个依赖文件(最左边的那个)
  8     $(CC) $^ $(CFLAGS) $@
  9 tool1.o:tool1.cpp
 10     $(CC) $^ $(CFLAGS) $@
 11 tool2.o:tool2.cpp
 12     $(CC) $^ $(CFLAGS) $@
 13 
 14 clean:
 15     rm *.o mytool -rf

再简化

  1 tmp=main.o tool1.o tool2.o
  2 CFLAGS=-c -o
  3 
  4 mytool:$(tmp) # 依赖关系
  5     $(CC) $^ -o $@
  6 
  7 %.o:%.cpp
  8     $(CC) $^ $(CFLAGS) $@ # 总结为一句
  9 
 10 clean:
 11     rm *.o mytool -rf
# 使用伪目标去避免 makefile中定义的只执行命令的目标和工作目录下的实际文件 出现 名字冲突
# 如果 工作目录下有一个 clean文件,执行 make clean (由于规则没有依赖文件,所以目标clean总被认为是最新的) 后面的 rm 命令 不会被执行
# 这时就需要将 clean 声明为 伪目标
.PHONY: clean

makefile 中有一些预定义的变量
AR:库文件维护程序的名称 默认值是 ar
AS:汇编程序的名称 默认值是 as
CC:C编译器的名称 默认值是cc,其实就是gcc。

# cc是Unix系统的C Compiler,一个古老的C编译器
# Linux下的 cc 一般是一个符号链接,指向gcc
$ ls -l /usr/bin/cc
lrwxrwxrwx 1 root root  /usr/bin/cc -> /etc/alternatives/cc
$ ls -l /etc/alternatives/cc
lrwxrwxrwx 1 root root  /etc/alternatives/cc -> /usr/bin/gcc

你可能感兴趣的:(C/C++,makefile)