【makefile】makefile工程编译模板

版权声明:本文为博主原创文章,未经博主允许不得转载。若允许转载,请注明来源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!

猜你喜欢

转载自blog.csdn.net/SoaringLee_fighting/article/details/82594605