ubuntu:make工程管理器大致了解


make工程管理器的作用

通过读入makefile文件执行大量编译工作,可以:

  • 减少编译工作量
  • 提高效率

makefile的基本结构

  • target
    目标体:目标文件或者可执行文件
  • dependency_file
    创造目标体所需的依赖文件
  • command
    创建每个目标体时所需要运行的命令
    基本格式为:
target : dependency_files
	command/*这行必须以Tab开头*/

举例:

hello.o:hello.c
	gcc -c hello.c -o hello

在命令行输入:

make hello.o

即可自动读入makefile文件,并执行对应target的command语句,并自动寻找依赖文件


makefile变量

变量是makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为变量值,可代替目标体、依赖文件、命令、其他部分。
变量的定义有两种方式: 递归展开式、简单方式
递归展开方式的定义格式为: VAR = var,可以嵌套引用但是会出现无穷循环的情况比如:
CFLAGS= $(CFLAGS) -O
简单扩展方式为: VAR:=var,不能嵌套引用 。

举例:下面是一个makefile文件

david:kang.o yul.o
	gcc kang.o yul.o -o myprog
kang.o:kang.c kang.h head.h
	gcc -Wall -O -g -c kang.c -o kang.o
yul.o:yul.c head.h
	gcc -Wall -O -g -c yul.c -o yul.o

现在使用变量改写这个文件

OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g 
david:$(OBJS)
	$(CC) $(OBJS) -o david
kang.o:kang.c kang.h head.h
	$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o:yul.c head.h
	$(CC) $(CFLAGS) -c yul.c -o yul.o

改写文件中的OBJS是用户的自定义变量,CCCFLAGS是预定义变量,常见的预定义变量有:

  • AR
    库文件维护程序的名称,默认值为ar
  • AS
    汇编程序的名称,默认值为as
  • CC
    C编译器的名称,默认值为cc
  • CPP
    C预编译器的名称,默认值为cc
  • CXX
    c++编译器的名称,默认值为g++
  • RM
    文件删除程序的名称,默认值为rm -f
  • ARFLAGS
    库文件维护程序选项,无默认值
  • ASFLAGS
    汇编程序的选项,无默认值
  • CFLAGS
    c编译器的选项,无默认值
  • CPPFLAGS
    c预编译器的选项,无默认值
  • CXXFLAGS
    c++编译器的选项,无默认值
  • FFLAGS
    Fortran编译器的选项,无默认值

为了进一步简化makefile编写还引入了自动变量,可以代表目标文件和依赖文件,常见的自动变量有:

  • $*
    不含扩展名的目标文件名称
  • $+
    所有依赖文件以空格分开,以出现的先后为顺序
  • $<
    第一个依赖文件的名称
  • $?
    所有时间戳比目标文件晚的依赖文件
  • $@
    目标文件的完整名称
  • $^
    所有不重复的依赖文件
  • $%
    如果目标是归档成员,则表示归档成员的名称

下面使用自动变量改写以下makefile文件

david:kang.o yul.o
	gcc kang.o yul.o -o myprog
kang.o:kang.c kang.h head.h
	gcc -Wall -O -g -c kang.c -o kang.o
yul.o:yul.c head.h
	gcc -Wall -O -g -c yul.c -o yul.o

改写后:

OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
	$(CC) $^ -o $@
kang.o:kang.c kang.h head.h
	gcc $(CFLAGS) -c $< -o $@
yul.o:yul.c head.h
	gcc $(CFLAGS) -c $< -o $@

make管理器使用

只需要在make命令后键入指定目标名,即可建立指定的目标,直接运行make则建立第一个目标

常用的make命令行选项

  • -C dir
    读入指定目录下的makefile
  • -f file
    读入当前目录下的file文件作为makefile
  • -i
    忽略所有命令的执行错误
  • -I dir
    指定被包含的makefile所在目录
原文地址:https://www.cnblogs.com/PythonFCG/p/13860083.html