1.make讲解
make命令执行时,需要一个Makefile文件,Makefile文件告诉make命令需要怎么样编译和 链接程序。Makefile文件指引make工具执行。
2.makefile常见模板
########### target name
# compile all .c file in $(PWD)
SRCS:=$(wildcard ./*.c) #通配符会自动展开,获取目录下所有c文件列表
#OBJS := $(SRCS:.c=.o) #?????
OBJS = $(patsubst %.c, %.o, $(SRCS)) #替换通配符
OUT := bpool
OUT_LIB := lib
OUT_SO := so
########### cross compiler and flags
CC := gcc
CFLAGS:= -g -O0
APP_CFLAGS += $(CFLAGS) -DMAINAPP
LIB_CFLAGS := $(CFLAGS)
SO_CFLAGS:=$(CFLAGS) -shared -fpic
LDFLAGS := -lrt -lpthread
### make file $(warning ) for debug
#tip1: .FORCE NO increment but fully compile whatever target or depend is changed?
#tip2: $@ $^ target and depends
#$(warning ####debug: objs=$(OBJS) )
all: $(OUT)
%.o: %.c
$(warning #### hide rules for single .c OBJS )
$(CC) $(APP_CFLAGS) -o $@ -c $^
$(OUT): $(OBJS)
@echo @@@@@@@ compile $@
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
$(OUT_LIB): bufferpool.c
@echo @@@@@@@ compile test.$@
$(CC) $(LIB_CFLAGS) -o $(OUT).$@ -c $^
$(OUT_SO): bufferpool.c
@echo @@@@@@@ compile test.$@
$(CC) $(SO_CFLAGS) -o $(OUT).$@ -c $^
.PHONY: clean
clean:
@rm -rf $(OBJS) $(OUT) *.lib *.so
3.makefile符号以及变量
3.1 各类赋值操作
= 进行赋值 (变量的值是整个Makefile中最后的值)
:= 直接赋值,赋予当前位置的值
?= 如果没有被赋值,则赋予等号后面的值
+= 累加,标识将等号后面的值添加到前面的变量上
示例: x := foo y := $(x) bar x := later 结果: x=foo bar x=later
3.2 常见变量
makefile中常见的变量
$@ 目标文件
$^ 所有依赖的文件
$< 第一个依赖的文件
$? 表示比目标还要新的依赖文件列表
通过使用上述变量,简化makefile文件
目标:依赖项
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
优化成
gcc -o $@ $^
3.3 makefile中函数
makefile中常见的函数,有字符处理函数,流程控制函数等。
1.findstring
$(findstring FIND,IN) 在字符串IN中,查找FIND字串
2.strip
$(strip
3.subst
$(subst
4.patsubst
$(patsubst
5.filter
$(filter
4.使用示例
main.o:main.c defs.h
CC -c main.c
#compile share lib
OBJS = dynamiclib_add.o
SRCS = dynamiclib_add.h
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) $(INCLUDE) -c $^
all:$(OBJS)
$(CC) -shared -fPIC -o$(TARGET)$(OBJS)
您还没有登录,请您登录后发表评论。