工作中会遇到makefile的书写,有必要做一些笔记。尽管网上有”万能模板“可以使用,但我觉得还是有必要从最基础的写起。
平常在windows下开发,不知道自己用过makefile,其实大部分IDE里面都集成了makefile,只不过大家平常没有注意,比如visual studio中集成了nmake,QT里面集成了qmake等。
(其余内容下次有时间补上)
【1】程序版本
开发调试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。
VERSION = 1.00 $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET)$(VERSION)
【2】编译器选择
Linux下为gcc/g++;arm下为arm-linux-gcc;不同CPU厂商提供的定制交叉编译器名称可能不同,如Hisilicon“arm-hisiv300-linux-gcc”。
CC = gcc
【3】宏定义
开发过程,特殊代码一般增加宏条件来选择是否编译,如调试打印输出代码。
-D是标识,后面接着的是“宏”。
DEBUG =-DUSE_DEBUG
【4】编译选项
可以指定编译条件,如显示警告(-Wall),优化等级(-O)。
CFLAGS =-Wall -O
【5】源文件
指定源文件目的路径,利用“wildcard”获取路径下所有依赖源文件。
SOURCES =$(wildcard ./source/*.c)
【6】头文件
包含依赖的头文件,包括源码文件和库文件的头文件。
INCLUDES =-I./include
【7】库文件名称
指定库文件名称,库文件有固定格式,静态库为libxxx.a;动态库为libxxx.so,指定库文件名称只需写“xxx”部分,
LIB_NAMES =-lfun_a -lfun_so
【8】库文件路径
指定依赖库文件的存放路径。注意如果引用的是动态库,动态库也许拷贝到“/lib”或者“/usr/lib”目录下,执行应用程序时,系统默认在该文件下索引动态库。
LIB_PATH =-L./lib
【9】目标文件
调用“patsubst”将源文件(.c)编译为目标文件(.o)。
OBJ =$(patsubst %.c, %.o, $(SOURCES))
【10】执行文件
执行文件名称
TARGET =app
【11】编译
%.o: %.c
$(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
【12】链接
可创建一个“output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件(.o)。
$(TARGET):$(OBJ) @mkdir -p output $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION) @rm -rf $(OBJ)
【13】清除编译信息
执行“make clean”清除编译产生的临时文件。
.PHONY:clean clean: @echo "Remove linked and compiled files......" rm -rf $(OBJ) $(TARGET) output
参考博客:https://blog.csdn.net/real_myth/article/details/72633320