Makefile

目标:依赖 
    命令

命令前必须有且仅有一个 Tab 符号 指令前加上 '@' , 该条指令本身不会在命令行中输出

一个简单的 Makefile

文件 t.c

CC=gcc 
CFLAGS=-Wall
sim:t.o
    gcc t.o -o sim
clean:
    @rm -f sim t.o
.PHONY : clean // 伪目标, 避免当前目录下有一个clean文件, make clean 无法执行

执行指令:

# make // 执行 Makefile 文件
# make clean // 调用 clean: 指定的指令

修改如下:

CC=gcc 
CFLAGS=-Wall
sim:t1.o
    gcc t1.o -o sim
t1.o:t.c
    gcc -c t.c -o t1.o
clean:
    rm -f sim t.o t1.o

make 后生成的文件是 t1.o sim 说明:

  • 依赖的是另一个目标, 互相依赖, 形成依赖树
  • 依赖(的指令)在目标(的指令)前执行

语句

条件语句是ifeq –else-endif、ifneq-else-endif、ifdef-else-endif

特殊目标

Makefile 中一般有这些目标

  • all:执行主要的编译工作,通常用作缺省目标,放在最前面。
  • Install:执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
  • clean:删除编译生成的二进制文件。
  • distclean:删除除源文件之外的所有中间生成文件,如配置文件,文档等。
  • tags:为vim等编辑器生成tags文件。
  • help:打印当前Makefile的帮助信息,比如有哪些目标可以有make指定去执行

因为这些目标一般不需要"依赖", 如果目录中有一个与目标同名的文件, 会有 "make: `xxx' is up to date" 报错, 解决方法是使用 .PHONY 声明这是伪目标

隐含规则

不写出 这个规则的情况下, 如果有, 就会调用对应的隐含规则;

  • 自动从 .c 文件推到出 .o; "x:x.o"
  • CFLAGS/CXXFLAGS 被隐含传递给编译器

results matching ""

    No results matching ""