Makefile入门实例

2024-09-01 02:32
文章标签 入门 实例 makefile

本文主要是介绍Makefile入门实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Makefile概述

makefile文件是用来描述整个工程的编译连接规则的,主要描述哪些源文件需要编译以及如何编译,如何生成我们想要的可执行文件。一旦Makefile文件写好,只需要一个make命令,整个工程完全自动编译,极大提高了软件的开发效率。

Makefile规则

Makefile主要有三大规则:目标、依赖条件和命令

目标:是我们要生成的文件

依赖:是要生成的文件是通过哪些文件来生成的

命令:是如何将依赖中的文件生成目标文件

格式如下:

目标:依赖条件

tab缩进)命令

Makefile简单实例

test:main.c add.c sub.c(.c文件所在路径和Makefile是同一个路径,如果不是同一个目录需要显示指定.c文件的路径)gcc main.c add.c sub.c -o test

其中test为目标,依赖条件是main.c、add.c和sub.c,命令是gcc main.c add.c -o test。

意思就是test是由main.c、add.c、sub.c文件通过gcc命令来生成的

Makefile实例进阶1

上面方式生成的test效率会比较低,因为只要任何一个依赖文件进行修改都需要重新编译所有文件。为了让只编译修改的文件,可以将上述的Makefile修改成如下形式

test:main.o add.o sub.ogcc main.o add.o sub.o -o testmain.o:main.cgcc -c main.cadd.o:add.cgcc -c add.csub.o:sub.cgcc -c sub.c

在上面的Makefile中,test、main.o、add.o、sub.o都是目标文件,在有多个目标文件的情况下,第一个目标文件为我们最终的目标文件,下面的其他所有目标文件都是用来生成第一个目标文件的

上面的实例中,test不再由.c文件来生成了,而是由.o文件来生成。当其中一个.c文件修改了,只会执行对应的命令生成.o文件,不需要所有的文件都重新编译。例如:mian.c修改了,只会执行gcc -c main.c来生成main.c文件,add.o和sub.o不需要重新编译生成。

由上面生成规则可以知道,Makefile只有检查到依赖项的生成时间比目标的时间晚,才会重新编译

Makefile实例进阶2

如果依赖文件很多,那按照上面的编写方法来写Makefile文件效率会很低,而且会写的很长。所以引入Makefile提供的变量来将上面的内容写的更加简洁一些。

obj=main.o add.o sub.o
target=test
$(target):$(obj)gcc $(obj) -o $(target)%.o:%.c
gcc -c $< -o $@

obj为自定义的变量,变量值为main.o add.o sub.o

target也是自定义的变量,变量值为test

Makefile中取变量值的方式是通过$()来取的

%.o:%.c类似于for循环,遍历target的依赖条件obj的时候,会逐个匹配的,%号是正则匹配的。例如先找到main.o时,%.o就是main.o,%.c就是mian.c,然后“gcc -c $< -o $@”就表示由main.c生成main.o.

其中 &lt; 和 &lt;和 <@是Makefile中自动的变量,含义如下:

$<:表示规则中的一个依赖
$@:表示规则中的目标
$^:表示规则中的所有依赖

这篇关于Makefile入门实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125694

相关文章

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与