新手入门makefile教程

新手入门makefile教程定义我们在 linux 下进行编程时 通常使用的时 gcc 编译器 这种情况下我们通常要去手写编译命令 如 gcca cb c oapp 这虽然看上去很简单 但在实际开发中 往往需要编译的文件有很多 甚至还要去链接一些动态库等等 我们不可能每次都去写一长串的命令 为了方便管理 makefile 就诞生了 它可以使用一些简单的规则 来帮助我们构建编译命令 十分方便 makefile 中的规则以 gcca cb c oapp 为例 将其写成规则 分为以下三个部分 目标 依赖和命令 第一版 app a

为什么使用makefile

我们在linux下进行编程时,通常使用的是gcc编译器,这种情况下我们通常要去手写编译命令,如:gcc a.c b.c -o app。这虽然看上去很简单,但在实际开发中,往往需要编译的文件有很多,甚至还要去链接一些动态库等等,我们不可能每次都去写一长串的命令。为了方便管理,makefile就诞生了,它可以使用一些简单的规则,来帮助我们构建编译命令,十分方便。

makefile中的规则

以 gcc a.c b.c -o app为例,将其写成规则,分为三个部分:目标、依赖和命令。下面是五个版本的makefile写法。

第一版

app:a.c b.c #app是目标,a.c和b.c是依赖 gcc a.c b.c -o app 

上述写法效率太低,修改一个文件,其他文件也需修改。

第二版

app:a.o b.o gcc a.o b.o -o app a.o:a.c gcc a.c b.o:b.c gcc b.c 

只修改一个源文件如a.c,则make只执行gcc a.c和gcc a.o b.o -o app两条命令,不再执行gcc b.c。

第三版

obj=a.o b.o #声明变量 target=app #声明变量 $(target):$(obj) #$用于变量取值 gcc $(obj) -o $(target) %.o:%.c gcc -c $< -o $@ # $@:规则中的目标 # $<:规则中的第一个依赖 # $^:规则中的所有依赖 # 上述符号只能在命令中使用 

上述写法的可移植性依然很差。

第四版

src=$(wildcard ./*.c) #查找指定目录下的.c文件 obj=$(patsubst %.c, %.o, $(src)) #匹配替换,如将src中的a.c替换成a.o,b.c替换成b.o target=app $(target):$(obj) gcc $(obj) -o $(target) %.o:%.c gcc -c $< -o $@ 

上述写法的缺点是不能自动清理项目。

第五版

添加清理项目的规则

src=$(wildcard ./*.c) #查找指定目录下的.c文件 obj=$(patsubst %.c, %.o, $(src)) #匹配替换,如将src中的a.c替换成a.o,b.c替换成b.o target=app $(target):$(obj) gcc $(obj) -o $(target) %.o:%.c gcc -c $< -o $@ .PHONY:clean #声明伪目标,防止受当前目录已存在clean的影响 clean: rm $(obj) $(target) -f #-f表示强制执行 

makefile的使用

在工作目录下创建并编写好makefile文件后,在终端输入make(确保make已经安装)即可生成目标文件以及最终的可执行程序。然后输入make clean(如果写了该规则)可以清理生成的中间文件和可执行程序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228307.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:20
下一篇 2026年3月16日 下午7:20


相关推荐

  • androidview添加阴影_ios13去除壁纸阴影

    androidview添加阴影_ios13去除壁纸阴影ios给 UIView 添加阴影

    2022年4月20日
    394
  • 矩阵宏观调度:Zigzag扫描打印矩阵matrix,图像工程的一种编码

    矩阵宏观调度:Zigzag扫描打印矩阵matrix,图像工程的一种编码1 矩阵的 zigzag 扫描打印是图像工程中的一种编码方式 它的扫描打印代码是需要利用宏观调度的 2 AB 从左上角 A 先往右 B 先往下 然后 A 往下 B 往右 最后相遇结束 尤其要注意 Ar 更新和 Bc 的更新 一定要放在 Ac 和 Br 的前面 3 笔试求 AC 可以不考虑空间复杂度 但是面试既要考虑时间复杂度最优 也要考虑空间复杂度最优

    2026年3月18日
    3
  • ubuntu20.04安装edge浏览器

    ubuntu20.04安装edge浏览器下载地址:www.microsoftedgeinsider.com/zh-cn/download/?platform=linux-deb下载链接是:https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-dev/microsoft-edge-dev_88.0.705.9-1_amd64.deb安装命令:dpkg-imicrosoft-edge-dev_88.0.705.9-1_amd64.deb..

    2022年7月21日
    18
  • 协程

    协程介绍协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。、需要强调的是:对比操作系统控制

    2022年3月29日
    56
  • idea for mac 快捷键设置_macidea使用快捷键

    idea for mac 快捷键设置_macidea使用快捷键最强IDEA关于Mac版本的常用快捷键

    2022年8月31日
    9
  • Java实现两数之和「建议收藏」

    Java实现两数之和「建议收藏」给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次示例:给定nums=[2,7,11,15],target=9因为nums[0]+nums[1]=2+7=9所以返回[0,1]方法一:暴力法遍历每个元素x,并查找是否存在一个值与target…

    2022年6月14日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号