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。
功能:查找 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式,如果匹配的话,则以 替换。这里,可以包括通配符“%”,表示任意长度的字串。如果中也包含“%”,那么, 中的这个“%”将是中的那个“%”所代表的字串。(可以用“\”来转义,以“%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
示例
$(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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值