版权声明:本文为博主原创文章,未经博主允许不得转载。若允许转载,请注明来源https://blog.csdn.net/SoaringLee_fighting,否则保留追究法律责任的权利! https://blog.csdn.net/SoaringLee_fighting/article/details/82594605
Date: 2018.9.10
1、前言
最近在调试一个解码器工程时,编写了一个简单的makefile,通过makefile实现工程demo的编译,涉及到makefile使用的相关知识,分享出来供大家学习。
2、makefile使用相关知识
2.1 规则语法:
target ... : prerequisites ...
command
...
2.2 VPATH的使用
示例1 - 当前目录中找不到文件时, 按顺序从 src目录, ../parent-dir目录中查找文件
VPATH src:../parent-dir
示例2 - .h结尾的文件都从 ./header 目录中查找
VPATH %.h ./header
2.3 变量的定义
= 延迟赋值 ,将整个makefile中的所有变量的值都计算完之后,确定该变量的值。
:= 立即赋值,:=只能使用前面定义好的变量。
+= 追加赋值
?= 条件赋值
2.4 自动变量
$@ 所有目标的集合
$^ 所有依赖目标的集合, 会去除重复的依赖目标
$+ 所有依赖目标的集合, 不会去除重复的依赖目标
$? 比目标新的依赖目标的集合
2.5 伪目标
并不是一个”目标(target)”, 不像真正的目标那样会生成一个目标文件.
典型的伪目标是 Makefile 中用来清理编译过程中中间文件的 clean 伪目标, 一般格式如下:
.PHONY: clean <-- 这句没有也行, 但是最好加上
clean:
-rm -f *.o
2.6 变量替换和变量引用
#变量替换
SRCS := programA.c programB.c programC.c
OBJS := $(SRCS:%.c=%.o)
#变量引用
$(SRCS)
echo $(SRCS)
2.7 C相关命令和参数定义
命令 | 含义 | 示例 |
---|---|---|
RM | rm -f | RM=rm -f |
AR | ar | AR=ar |
CC | gcc | CC=gcc |
CXX | g++ | CXX=g++ |
ARFLAGS | AR命令的参数 | -crus |
CFLAGS | C语言编译器的参数 | CFLGAS+=-Wall -O3 -fPIC -fsigned-char |
CXXFLAGS | C++语言编译器的参数 | 同上 |
LDFLAGS | ld链接器的参数 | 同上 |
3、makefile工程编译模板
#设置相关工具
CC = gcc
CXX = g++
AR = ar
LD = ld
#设置相关路径
VPATH %.h ./inc
ROOTSRC = ./src
INCLUDES = ./inc
#设置工具的相关参数
BIN_TARGET = DEMO
CFLAGS += -Wall -O3 -g -I$(INCLUDES)
LDFLAGS += -Wall -O3 -g
ARFLAGS += -crus
SRCS = $(ROOTSRC)/file1.c \
$(ROOTSRC)/file2.cpp \
$(ROOTSRC)/file2.s
OBJS = $(patsubst %.s, %.o, $(patsubst %.cpp,%.o, $(patsubst %.c,%.o,$(SRCS))))
#编译规则
all: clean $(BIN_TARGET)
BIN_TARGET: $(OBJS)
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
rm $(OBJS)
%.o: %.c
$(CC) -c $< $(CFLAGS) -o $@
%.o: %.cpp
$(CXX) -c $< $(CFLAGS) -o $@
.PHONY: clean
clean:
rm $(OBJS)
rm $(BIN_TARGET)
4、参考
https://www.cnblogs.com/wang_yb/p/3990952.html
https://www.cnblogs.com/yyangblog/p/4159778.html
THE END!