【嵌入式八股16】Makefile
一、简单的 Makefile 示例
以下是一个简单的 Makefile 示例,展示了如何编译多个源文件生成可执行文件:
CROSS_COMPILE=/opt/4.5.1/bin/arm-linux-
CC=$(CROSS_COMPILE)gcc
AS=$(CROSS_COMPILE)as
LD=$(CROSS_COMPILE)ld
CFLAGS=-g -Wall
LIBS=-lpthread
all:main
main:main.o gsm_gprs.o socket.o telosb.o wifi.o
$(CC) $(CFLAGS) $(LIBS) $^ -o $@
main.o: main.c gsm_gprs.h option.h telosb.h
$(CC) $(CFLAGS) -c $<
gsm_gprs.o:gsm_gprs.c gsm_gprs.h socket.h
$(CC) $(CFLAGS) -c $<
socket.o:socket.c socket.h option.h
$(CC) $(CFLAGS) -c $<
telosb.o: telosb.c telosb.h option.h
$(CC) $(CFLAGS) -c $<
wifi.o: wifi.c wifi.h option.h
$(CC) $(CFLAGS) -c $<
clean:
-rm main -f *\.o *\*~ *~
代码解释
CROSS_COMPILE
:指定交叉编译工具链的前缀。CC
、AS
、LD
:分别指定编译器、汇编器和链接器。CFLAGS
:编译选项,-g
表示生成调试信息,-Wall
表示开启所有常见的编译警告。LIBS
:链接时需要的库文件,这里使用了-lpthread
表示链接 pthread 库。all
:默认目标,指定要生成的最终可执行文件。main
:可执行文件的目标,依赖于多个.o
文件,通过$(CC)
进行链接。*.o
:每个.o
文件的目标,依赖于对应的.c
文件和头文件,通过$(CC) -c
进行编译。clean
:清理目标,用于删除生成的可执行文件和.o
文件。
二、Makefile 赋值方式
Makefile 提供了多种赋值方式,每种方式有不同的特点,如下表所示:
= |
基本的赋值方式,会在 Makefile 的最后才进行赋值,即采用延迟赋值。例如,一个变量在多处被赋值,最终的值是最后一次赋值的结果。 |
:= |
覆盖之前的值,并且会立即赋值。在使用该符号赋值时,变量的值在赋值语句执行时就确定了,不会受到后续赋值的影响。 |
?= |
如果变量没有被赋值过,则进行赋值;如果已经有值,则保持不变。这可以用于设置默认值。 |
+= |
向变量已有的值后面添加新的值,常用于追加编译选项、库文件等。 |
三、伪目标 .PHONY
.PHONY : clean
PHONY
用于声明伪目标。伪目标不是真正的文件,而是一种执行特定操作的目标。例如,clean
目标通常用于清理生成的文件,但如果当前目录下恰好存在一个名为 clean
的文件,make clean
可能不会按预期执行。使用 .PHONY
声明后,make
会忽略同名文件的存在,确保 clean
目标的操作能够正常执行。
四、make
命令默认支持的文件名
make
指令如果没有指定具体的 Makefile 文件,会自动按照以下顺序寻找 Makefile 文件:
GNUmakefile |
makefile |
Makefile |
通常建议使用 Makefile
作为文件名,因为它是最常见的命名方式,便于识别和管理。
五、include
和 -include
include
include
用于在一个 Makefile 中包含另一个 Makefile 文件。这可以将一个大型的 Makefile 拆分成多个小的文件,提高代码的可读性和可维护性。例如:
include another.mk
-include
-include
与 include
类似,但当包含过程中出现错误(如文件不存在)时,不会报错,而是继续执行 Makefile。例如:
-include optional.mk
六、MAKEFILES
环境变量
MAKE
会自动包含 MAKEFILES
环境变量中指定的值。可以通过设置该环境变量来指定额外的 Makefile 文件,例如:
export MAKEFILES="common.mk"
make
这样,make
在执行时会自动包含 common.mk
文件。
七、VPATH
和 vpath
VPATH
VPATH
用于指定 Makefile 搜索文件的路径。当 Makefile 中需要的文件不在当前目录时,可以通过 VPATH
指定搜索路径,例如:
VPATH = src:include
这表示 make
会在 src
和 include
目录中搜索所需的文件。
vpath
vpath
是 make
的关键词,用于设置文件的搜索路径。与 VPATH
不同的是,vpath
可以针对不同类型的文件设置不同的搜索路径,例如:
vpath %.c src
vpath %.h include
这表示 make
会在 src
目录中搜索 .c
文件,在 include
目录中搜索 .h
文件。
八、Makefile 内建函数
(一)文本处理和分析函数
1. 替换函数 $(subst from,to,text)
该函数用于将 text
中所有的 from
替换为 to
,例如:
$(subst old,new,old text)
结果为 new text
。
2. 模式替换函数 $(patsubst pattern,replacement,text)
可以使用 %
作为通配符(只有第一个 %
有效),用于将 text
中匹配 pattern
的部分替换为 replacement
,例如:
$(patsubst %.c,%.o,x.c.c bar.c)
结果为 x.c.o bar.o
。
3. 去除空格函数 $(strip string)
该函数用于去掉 string
两端的空格,并将连续的多个空格替换为一个空格,例如:
$(strip hello wor
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
一些八股模拟拷打Point,万一有点用呢