要想使用make ( 自动化编译工具),需要编写Makefile,名称Makefile 或者makefile都行
makefile三要素:目标;依赖;命令
makefile执行原理:从上到下建立依赖关系;从下到上执行
最简单的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
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
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= ( p a t s u b s t (patsubst %.c,%.o, (patsubst(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)