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

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接