这儿有一个讲Makefile讲得很好的帖子, 简明易懂Makefile经典教程(掌握这些足够)

这儿简述一下.

  • Makefile主要描述依赖关系, 根据依赖关系决定哪些重新编译. 按下面的格式, 如果被依赖文件任意一个被修改, 则调用命令
目标文件: 被依赖文件1 被依赖文件2 ...
    命令

如(cc表示 c complier)

edit: file1.o file2.o
   cc -o edit file1.o file2.o
file1.o: file1.c common.h
  cc -c file1.c
file2.o: file2.c common.h
  cc -c file2.c
  • 使用Make命令默认找Makefile下的第一个目标文件,并把它的依赖解决并输出.
  • 变量使用方式
# 定义
变量名 = 内容  
# 调用
$(变量名)

OBJFILE = file1.o file2.o
edit: $(OBJFILE)
  cc - o edit $(OBJFILE)
  • 其他语句如clean的使用方式
    要调用make clean清理编译的中间件, 其实有点像npm run dev之类的调用. 此时clean作为label,放置在最后面, 以免被当成目标文件.
edit: file1.o file2.o
   cc -o edit file1.o file2.o
file1.o: file1.c common.h
  cc -c file1.c
file2.o: file2.c common.h
  cc -c file2.c

clean:
  rm -f file1.o file2.o
  • 编译o文件可默认省略对c文件的依赖名和编译调用
edit: file1.o file2.o
   cc -o edit file1.o file2.o
file1.o: common.h
file2.o: common.h
  • 然后又可以合并:
OBJFILE = file1.o file2.o
edit: $(OBJFILE)
  cc - o edit $(OBJFILE)
$(OBJFILE): common.h
  • 在执行命令前加"-"号可以让命令持续执行而不管中间出现的错误(如文件不存在)
# 这儿省略前面的内容...

clean:
  -rm -f file1.o file2.o
  • =, :=, ?=这几种赋值方式的区别
    直接=的话, 在变量可以在后面再定义, 如:
A = $(B) 
B= var1 

# 此时 A值为var1

用:=的话, 如果前面没有定义, 就为空了

A := $(B)
B := var1

# A此时为空

用?=的话, 如果前面有定义, 就不再定义, 如果没有才使用?=的定义

B := var1
B ?= var2

# 此时B仍为var1
  • 条件语句
    有ifeq, else endif
ifeq($(B), var1)
   # do sth
else
  # do sth
endif

除了ifeq外, 还有ifneq, ifdef, ifndef这几个比较语句

  • $的其他表达
    如果要表示$符号,你得输入$$才行.

  • 自动化变量
    $@ $<依次指代目标, 依赖. 并且所指是一组目标,依赖, 并将这一组目标依赖依次代入调用中.

  • 其他语句

用来设置某一类的文件在哪个路径下搜索的
vpath 文件类型 路径

vpath %.c driver user

标签: none 阅读量: 1120

添加新评论