0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Makefile文件的编写规则及实例

CHANBAEK 来源:小浩笔记 作者:一纸HH 2023-05-19 14:52 次阅读

Makefile带来直接好处就是——“自动化编译”。一旦写好,只需要一个make命令,整个工程完全自动编译,所以十分方便。而Makefile文件就是告诉make命令怎么样地去编译和链接程序。但是想要比较灵活的运用它,还是先要熟悉一些关于系统对程序编译和链接的知识。

1.一个简单的makefile例子

假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生成file可执行文件

file:file1.o file2.o       附属行(文件的依存关系)
    gcc -o file1.o file2.o    命令行
file1.o:file1.c head.h
    gcc -c file1.c
file2.o:file2.c head.h
    gcc -c file2.c

从file最终的目标文件开始倒推,依次列出文件的依存关系,make在执行时:

(1)判断file可执行文件是否存在,若不存在,则执行命令行,向下寻找依存关系

(2)若file存在,则检查依靠文件,是否存在更新,若存在更新则执行命令行,若没有更新则给出提示:

make:'file' is up to date.

2.makefile中的宏定义及内部变量

宏定义:

OBJS = file1.o file2.o
CC = gcc
CFLAGS = -wall -O -g

引用:

file:$(OBJS)
    $(CC) $(OBJS) -o file
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c file1.c
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c file2.c

内部变量:

$^ 代表所有的依赖文件

$@ 代表所有的目标文件

$< 代表第一个依赖文件

file:$(OBJS)
    $(CC) $^ -o $@
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c $< -o $@
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c $< -o $@

"(CC) **(FLAGS) -c **< -o @"是隐含规则,可以不写,默认使用此规则ww

3.假象

假设一个项目要生成两个可执行文件file1和file2,这两个文件是独立的,则在makefile开始处:

all:file1 file2

make总是假设all要生成,去检查它的依赖文件

4.清除由make产生的文件

clean:
    rm *.o
    rm file

执行:

make clean

则会清除由make生成的*.o和file文件

如果有clean文件存在,则清除不会执行(因clean没有可依赖的文件,永远是最新的)

使用PHONY目标,避免同名文件相冲突,不会检查clean文件存在与否,都要执行清除操作

.PHONY : clean
clean:
    rm *.o   
     rm file

5.makefile函数

搜索当前目录,生成由*.c结尾的文件列表,wildcard--函数名

SOURCE = $(wildcard *.c)

用%.o替换$(SOURCE)中的%.c文件

OBJS = $(patsubst %.c,%.o,$(SOURCE))

6.产生新规则

SOURCE = $(wildcard *.c)
depends:$(SOURCE)
    gcc -M $(SOURCE) > depends

(为每一个.c文件产生规则,c文件和相关头文件为依靠)

在makefile文件中:

include depends

7.一个有效的makefile文件

可以完成大部分我们所需要的依靠检查,不用做太多的修改就可用在大多数项目里

功能:搜索当前目录,寻找源码文件,放入SOURCE变量里,利用patsubst产生目标文件(*.o)

CC = gcc
CFLAGS = -Wall -O -g
 
SOURCE = $(wildcard *.c,*.cc)
OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))
 
file:$(OBJS)
    $(CC) $^ -o $@

用默认规则产生目标文件(*.o)

(缺点:并未包含头文件,当头文件更新时,不能重新编译)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 文件
    +关注

    关注

    1

    文章

    560

    浏览量

    24653
  • 程序
    +关注

    关注

    115

    文章

    3753

    浏览量

    80709
  • 命令
    +关注

    关注

    5

    文章

    671

    浏览量

    21959
  • 编译
    +关注

    关注

    0

    文章

    647

    浏览量

    32758
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    19156
收藏 人收藏

    评论

    相关推荐

    关于Makefile自动生成-autotools的使用

    在Linux应用开发中,编写Makefile是一项必备技能,因为它定义了工程中所有文件的编译顺序、规则和依赖关系,决定了哪些文件需要编译以及
    的头像 发表于 07-25 15:50 1431次阅读
    关于<b class='flag-5'>Makefile</b>自动生成-autotools的使用

    Makefile的引入及规则

    裸板程序的时候,使用Makefile组织管理这些程序,本节讲解Makefile最基本的规则Makefile要做什么事情呢? 组织管理程序和文件
    发表于 04-11 17:37

    Makefile函数和实例分析

    首发平台:微信公众号baiwenkejiARM裸机1期加强版视频课程配套WiKi第9课第7节Makefile函数和第8节Makefile实例。发现没有?wiki.100ask.org 也有变化:多了
    发表于 04-25 11:03

    Makefile编写

    的起始字符必须为TAB字符。如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容。接下来就根据这个Makefile基本规则
    发表于 11-02 15:59

    什么是脚本? makefile编写规则有哪些

    一、实验目的和要求1了解什么是脚本2掌握shell编程方法3掌握makefile编写规则二、实验内容和原理1编写一个Shell脚本,要求:显示当前目录的所有内容,并统计可执行
    发表于 12-22 07:52

    如何编写makefile文件

    如何编写makefile文件
    发表于 12-24 07:36

    怎样去编写makefile体系的规则

    为什么要学习makefilemakefile体系的工作原理是什么?怎样去编写makefile体系的规则呢?
    发表于 12-27 06:36

    makefile文件编写方式

    文章围绕makefile文件编写方式,向读者讲述如何在ubuntu平台上用交叉编译链 arm-none-eabi- 编译出 STM32F4xx 系列 MCU 的执行文件。文章核心在于
    发表于 02-07 06:47

    Linux内核Makefile文件

    Makefile文件的详细编写过程
    发表于 08-28 09:25 14次下载

    如何写Makefile编译汇编和C文件

    经常在一个项目中包含多个.c源文件,而且一个.c源文件包含了一堆的头文件,这种情况下如何编写makefile,使得能成功编译整个项目?本博文
    发表于 11-24 09:03 1.4w次阅读
    如何写<b class='flag-5'>Makefile</b>编译汇编和C<b class='flag-5'>文件</b>

    Makefile编写实例程序和详细资料免费下载

    本文档的作用内容详细介绍的是Makefile编写实例程序和详细资料免费下载。
    发表于 09-12 11:55 6次下载
    <b class='flag-5'>Makefile</b><b class='flag-5'>编写实例</b>程序和详细资料免费下载

    Linux关于Makefile的用法介绍

    Make可以从一个名为Makefile文件中获得如何构建程序的知识,该文件列出了每个非源文件以及如何从其他文件计算它。当你
    发表于 12-24 10:36 1871次阅读

    makefile都有哪些语法?

    中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile规则。也就是Makefile
    的头像 发表于 05-06 16:07 1422次阅读

    Makefile是如何编译代码文件的?

    makefile文件最常用的作用是,告诉make程序,如何来编译以及连接程序,最终生成可执行的二进制文件
    的头像 发表于 05-18 15:27 4190次阅读
    <b class='flag-5'>Makefile</b>是如何编译代码<b class='flag-5'>文件</b>的?

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根据指定的依赖规则文件是否有修改来执行命令。常用来编译软件源代码,只需要重新编译修改过的文件,使得编译速度大大加快。
    的头像 发表于 01-25 11:18 629次阅读