makefile语法举例

tech2022-07-12  158

all:

gcc servo.c -o servo

clean:

rm -rf servo servo.o

 

 

main:main.o

gcc main.o -o main

main.o:main.c

gcc -c main.c

clean:

rm -rf main.o main

 

$*         不包括后缀名的当前依赖文件的名称

    $+         所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件

    $<         第一个依赖文件的名称

    $?         所有时间戳比目标文件晚的依赖文件,并以空格分开

    $@        目标文件的完整名称

    $^         所有不重复的目标依赖文件,以空格分开

    -:         告诉make命令忽略所有的错误

    @:       告诉make在执行命令前不要将改命令显示在标准输出上

在这里简单解释一下makefile中的相关命令:

CC = gcc #声明编译器

CFLAGS = -g -O -Wall #声明编译的选项

OBJ := add.o sub.o main.o #声明依赖的文件

TOPDIR := $(PWD) #声明顶级目录

OBJDIR := $(TOPDIR)/obj #定义编译中间文件的存放的目录

BINDIR := $(TOPDIR)/bin #定义可执行文件的存放目录

BIN := main #定义可执行文件的名称

SUBDIR :=  add sub main obj #声明所有的子目录

OBJHEAD := $(TOPDIR)/add/add.h $(TOPDIR)/sub/sub.h #声明所有的头文件

OBJLINK := --std=c99 #声明编译时候需要的链接护着其他的选项

export CC TOPDIR OBJDIR BINDIR BIN OBJLINK OBJ #到处所有的全局变量,给次级目录中的makefile只用

all:CHECKDIR $(SUBDIR) 

mkdir -p $(SUBDIR) $(BINDIR)

        对于makedir中的的选项:

                -m 对新建目录设置存取权限。也可以用chmod命令设置。

                -p 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录, 即一次可以建立多个目录。

make -C $@

        当make的目标为all时,

                -C $@ 指明跳转到次级目录下读取那里的Makefile;

                M=$(PWD) 表明读取完Makefile(次级目录下Makefile)执行完成后返回到当前目录继续读入、执行当前的Makefile(     顶级目录下Makefile)。   

clean:

        关于clean的规则,在make clean的时候,并不产生目标文件,且没有依赖文件,所以命令都会执行,但如果目录中存在名为“clean”的文件或者目录,则规则没有依赖文件,且clean始终是最新的,所以命令不会被执行,为了避免这个问题,可以使用.PHONY来指明改目标,则将上述的clean部分修改为:

gcc -DLINUX -ICommon/Common Common/Common/*.cpp *.cpp -lpthread -ldl -fPIC-lpthread -ldl -fPIC

后续补充,,,,,,,

最新回复(0)