目录
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 app
add.o:add.c
gcc -c add.c -I../include
jian.o:jian.c
gcc -c jian.c -I../include
cheng.o:cheng.c
gcc -c cheng.c -I../include
chu.o:chu.c
gcc -c chu.c -I../include
main.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=gcc
INCLUDE=-I../include
CFLAGS=-c -g -Wall $(INCLUDE) #-g增加调试信息 -Wall严格编译
CPPFLAGS=-E -D #-E头文件展开 -D编译时定义宏
CXX=g++
LDFLAGS=-L../lib -lpthread #这只是个例子,并没用到该库。-l库名
TARGET=app
RM=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/bin
uninstall:
sudo $(RM) /usr/bin/$(TARGET)