首页 > 其他 > 详细

Makefile

时间:2020-08-22 18:16:41      阅读:76      评论:0      收藏:0      [点我收藏+]

Makefile

自动编译管理项目源码, 节省编译时间, 复用性强

https://www.cnblogs.com/xkDiogt/p/13507627.html

.c文件——>.o文件(中间文件)——>可执行程序文件

 

Makefile项目管理脚本文件

只可以Makefile或makefile, 其他文件名不允许使用

include目录:头文件

lib目录:库

Makefile文件:调度所有子目录下的Makefile

src目录:源码文件 + Makefile文件

技术分享图片

Makefile使用(src下的Makefile)

变量

1. 变量名尽量用大写(规范)

2. 默认情况变量存储的类型是字符串

3. 变量定义必须初始化

4. 使用变量的值, 需要进行取值操作:$(变量名)

5. # 表示单行注释

VAR=hello
$(VAR) # 使用VAR变量的值

Makefile三要素

目标、依赖、命令

app:
    echo $(VAR)

app:目标

依赖在目标后, 可以为空

echo $(VAR):命令前必须要有一个或多个制表符(tab键)

 

使用三要素编译项目

app:main.c add.c sub.c des.c
    gcc *.c -I../include -o app

Makefile节省编译时间的原理

1. 源码编译时需要大量的磁盘空间存放临时文件和中间文件

2. 项目完成之后将中间文件和临时文件删除

耗时的部分在生成中间文件, Makefile通过保留中间文件和临时文件节省编译时间

如果某一个.c文件修改了, 只需要将修改的文件重新生成就可以了(通过比较文件修改的时间, 目标比依赖新就不需要重新生成)

没有依赖就无法比较时间, 没办法节省时间

app:main.o add.o sub.o mul.o des.o
  gcc *.o -o app

main.o:main.c
  gcc -c -I../include main.c

add.o:add.c
  gcc -c -I../include add.c

mul.o:mul.c
  gcc -c -I../include mul.c

des.o:des.c
  gcc -c -I../include des.c
 
sub.o:sub.c
  gcc -c -I../include sub.c

 

执行

通过make命令即可执行当前目录下的makefile

make

 

Makefile执行顺序

自上向下分析, 自下向上执行

Makefile默认只能执行一个独立的目标(目标之间没有依赖)

有多个独立的目标会执行第一个

 

Makefile功能性目标

完成特定任务

clean目标:清除临时文件和中间文件

install目标:将编译生成的可执行程序转移到指定目录下(PATH:/usr/bin/)

distclean目标:将程序从指定路径中删除

clean:
    rm *.o -rf
    rm app -rf

install:
    sudo mv app /usr/bin

distclean:
    sudo rm /usr/bin/app

执行功能目标

make clean

如果当前目录存在和功能目标同名的文件, 功能目标将无法使用, 通过伪目标解决

伪目标:(忽略当前目录下和功能目标同名的文件)

在功能目标前添加这行代码即可

.PHONY:clean install distclean

 

Makefile内建语法:内置函数/命令修饰符/特殊变量

%:表示通配符

$<:第一个依赖

$@:目标名

$^:所有依赖

获取文件名函数:

SRCFILE=$(wildcard *.c) # 获取当前目录下所有.c文件

字符串处理函数:

DESFILE=$(patsubst %.c, %.c, $(SRCFILE)) # 将.c文件名改为.o文件名

 

app:$(DESFILE)
  gcc *.o -o app

%.o:%.c
  gcc -c -I../include $<

 

其他

@:修饰命令行, 执行make命令后, 不显示命令行本身, 直接显示命令行的结果

echo:
    @echo $(VAR)

-:如果命令失败, 兼容错误, 向后执行其他命令, 没有修饰, Makefile直接退出

removfile:
    -rm clean
    -rm clean_1

 

Makefile脚本

CC=gcc
CFLAGS=-c -g -Wall -I$(INCLUDEPATH)
INCLUDEPATH=../include
CPPFLAGS=-E -D -O1 -O2 -O3#预处理选项
LIBRARYPATH=../lib # 库路径
LIBNAME=pthread # 库名
LDFLAGS=-L$(LIBRARYPATH) -l$(LIBNAME) #库选项
TARGET=app # 程序名
INSTALLPATH=/usr/bin/

RM=sudo rm -rf
MV=sudo mv

SRCFILE=$(wildcard *.c)
DESFILE=$(patsubst %.c, %.c, $(SRCFILE))

$(TARGET):$(DESFILE)
  CC $^ -o $@

%.o:%.c
  CC $(CFLAGS) $<

.PHONY:clean install distclean
 
clean:
    $(RM) (DESFILE)
    $(RM) $(TARGET)

install:
    $(MV) $(TARGET) $(INSTALLPATH)
distclean:
    $(RM) $(INSTALLPATH)$(TARGET)

 

Makefile

原文:https://www.cnblogs.com/xkDiogt/p/13544982.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!