目录
makefile建立
1.最简单的makefile
2.makefile进阶
3.makefile优化
(1)常用的变量名(约定俗成的):
(2)一些特殊字符
(3)特殊变量
(4)makefile内置函数
代码
makefile三要素:目标;依赖;命令
makefile执行原理:从上到下建立依赖关系;从下到上执行
makefile建立
通过实现一个加减乘除方法作为例子,文件结构如图所示
src中文件如图所示:
然后编写src中Makefile文件
1.最简单的makefile
app:add.c jian.c cheng.c chu.c main.c gcc add.c jian.c cheng.c chu.c main.c -I../include -o app
2.makefile进阶
app:add.o jian.o cheng.o chu.o main.o gcc add.o jian.o cheng.o chu.o main.o -o appadd.o:add.c gcc -c add.c -I../includejian.o:jian.c gcc -c jian.c -I../includecheng.o:cheng.c gcc -c cheng.c -I../includechu.o:chu.c gcc -c chu.c -I../includemain.o:main.c gcc -c main.c -I../include
3.makefile优化
(1)常用的变量名(约定俗成的):
CC:表示c编译器版本
CFLAGS:表示编译时参数
CPPFLAGS:表示预处理参数
CXX:表示C++编译器版本
CXXFLAGS:表示c++编译时参数
LDFLAGS:表示库参数库选项
INCLUDE:表示头文件目录
TARGET:表示目标名
RM:删除选项
(2)一些特殊字符
$(变量):对变量取值
@:只显示命令结果,忽略命令本身
-:如果当前命令出错,忽略错误,继续执行
%:通配符,通配符是以遍历的方式实现的
(3)特殊变量
用于当前目标:
$@:代表目标
$<:代表依赖中的第一个
$^:代表所有依赖
(4)makefile内置函数
wildcard:按照指定格式获取当前目录下的所有文件名
例:SOURCEFILE=$(wildcard *.c):获取.c后缀的所有文件并返回赋值给SOURCEFILE
patsubst:根据指定的格式进行替换(字符串替换)
例:DEFFILE=$(patsubst %.c,%.o,$(SOURCEFILE))
代码
.PHONY:clean #伪目标CC=gccINCLUDE=-I../includeCFLAGS=-c -g -Wall $(INCLUDE) #-g增加调试信息 -Wall严格编译CPPFLAGS=-E -D #-E头文件展开 -D编译时定义宏CXX=g++LDFLAGS=-L../lib -lpthread #这只是个例子,并没用到该库。-l库名TARGET=appRM=rm -rf SRCFILE=$(wildcard *.c)DEFFILE=$(patsubst %.c,%.o,$(SRCFILE)) $(TARGET):$(DEFFILE) $(CC) $^ -o $(TARGET)%.o:%.c $(CC) $(CFLAGS) $< clean: -$(RM) $(TARGET) $(DEFFILE)install: sudo cp $(TARGET) /usr/binuninstall: sudo $(RM) /usr/bin/$(TARGET)