原创
makefile
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
</div>
<!--一个博主专栏付费入口-->
<!--一个博主专栏付费入口结束-->
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<div class="htmledit_views" id="content_views">
<p id="main-toc"><strong>目录</strong></p>
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)