Makefile使用步骤和主要关键字
理解一下=、:= 、?=
新建一个Makefile,内容为:
ifdef DEFINE_VRE
VRE = “Hello World!”
else
endif
ifeq ($(OPT),define)
VRE ?= “Hello World! First!”
endif
ifeq ($(OPT),add)
VRE += “Kelly!”
endif
ifeq ($(OPT),recover)
VRE := “Hello World! Again!”
endif
all:
@echo $(VRE)
敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover 输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!
从上面的结果中我们可以清楚的看到他们的区别了
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
掌握几个基础的Makefile函数(执行:$(functionname,avgs1 ,avgs2))
1.** VPATH**
指定make的依赖的搜索路径,不指定具体文件,但不是编译的路径,只是制定搜索路径,编译路径还是需要-I 来指定,同时make搜索路径顺序是当前路径,然后才是VPATH指定的路径。
格式:VPATH = ./src:…/include/
不同路径用:隔开
2. vpath
相比于VPATH更加的灵活,可以指定具体某一类文件搜索路径,通过pattern制定文件格式
三种用法或者格式:
vpath:不带任何参数,指清除所有已经设置好了的文件搜索目录。注意其清除vpath命令所设置的搜索路径,而不影响 VPATH变量所设置的查找路径。
vpath :清除pattern文件格式路径,比如vpath %.h 清除所有.h文件搜索路径
vpath :指定pattern搜索路径,不同路径:隔开,比如 vpath %.c ./src:…/src
3. 扩展通配符wildcard
格式:$(wildcard PATTERN…),获取工作目录下的所有PATTERN文件
src = $(wildcard .c ./src/.c):获取当前路径下和src目录下所有的.c文件
4. notdir 取文件名函数
格式:
(
n
o
t
d
i
r
s
r
c
/
f
o
o
.
c
h
a
c
k
s
)
,
输
出
f
o
o
.
c
5.
∗
∗
替
换
通
配
符
p
a
t
s
u
b
s
t
∗
∗
格
式
:
(notdir src/foo.c hacks),输出foo.c 5. **替换通配符patsubst** 格式:
(notdirsrc/foo.chacks),输出foo.c5.∗∗替换通配符patsubst∗∗格式:(patsubst ,,
名称:模式字符串替换函数——patsubst。
功能:查找
返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”
掌握Makefile中几个操作
1. ifeq ...else...endif
ifeq ($(OPT),define)
VRE ?= “Hello World! First!”
else
endif
make OPT=define
2. ifdef...esle...endif
ifdef DEFINE_VRE
VRE = “Hello World!”
else
endif
make DEFINE_VRE=true
掌握Makefile中几个关键字
函数源码的编译就是将.c、.cpp、.h文件按照一定的格式编译成机器码,但是源码文件有很多,有没有一种方式把他们组织起 来,这个工具就是Makefile。Makefile按照一定的格式,将源码组织起来进行编译。我们猜想一下,它会做哪些工作?1、你得告诉机器用什么编译器2、你得告诉机器你要编译哪些源码文件3、你要告诉机器这些源码的对应.h去哪里找4、你要告诉机器,按照具体什么规范来编译源码,不合理的代码编写,在编译中要告诉编写者,你要告诉机器你是否需要对代码进行优化…
1.CFLAGS
CFLAGS变量用于设置编译选项,主要是指定.h路径,指定编译选项,指定宏定义
CFLAGS:= -I …/inc/ -I ./src : 指定…/inc src两个目录
CFLAGS+= -O2 -WALL -g
CFLAGS+=-DTOSH_DATA_LENGTH=10
CFLAGS+=-DUSE_DEBUG
2.** 三个简写 **
$@,$^,$< ------> $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件
举个栗子
./Makefile
./b.c
./ab.h
./a.c
./main.c
./sub
./sub/sa.c
./sub/sb.c
./sub/sab.h
Makefile
vpath %.c ./sub/
vpath %.c ./
src = $(wildcard(*.c ./sub/*.c))
src_c_cpp = $(notdir $(src))
obj = $(patsubst %.c ,%.o,$(src_c_cpp))
CFLAGS:=-I ./sub、 -I ./
CFLAGS+= -Wunused-variable
TARGAT := libmain.so
.PHONY all clean:
all:$(TARGAT )
$(TARGAT ):$(obj)
gcc -shared -fPIC $^ -o $@ //静态库:gcc -shared --enable-static $^ -o $@
%.o:%.c
gcc -g $(CFLAGS) -o $@ $<
clean:
rm *.o
执行make之后,生成libmain.so
gcc main.c -o main.out -I ./ -I ./sub/ -L ./ -lmain