为什么使用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.ogcc a.o b.o -o app
a.o:a.cgcc a.c
b.o:b.cgcc 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:%.cgcc -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:%.cgcc -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:%.cgcc -c $< -o $@
.PHONY:clean  #声明伪目标,防止受当前目录已存在clean的影响
clean:rm $(obj) $(target) -f  #-f表示强制执行

makefile的使用

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

新手入门makefile教程相关推荐

  1. 阿里云服务器购买及使用流程(新手入门图文教程)

    阿里云服务器购买及使用流程(新手入门图文教程) 一.登录及密码重置 二.远程连接 三.网络安全组设置 进入 https://www.aliyun.com/,选择所需ESC的配置并购买(选择时可参考购买 ...

  2. 微风:AI新手入门学习教程

    大家好我是微风,一个爱设计爱生活的平面设计师,最近总有一些朋友问我,零基础学习AI软件好学吗,AI新手学习软件好操作嘛,那么今天的这篇文章主要给大家介绍下新手AI新手入门学习教程以及学习平面设计分为哪 ...

  3. 程序人生:黑帽seo新手入门基础教程

    黑帽搜索引擎优化新手入门基础教程 从原理来看,使用黑帽搜索引擎优化技术做排名,与白帽搜索引擎优化是一样的.从细化的操作来看,则有很大的不同.黑帽搜索引擎优化新手入门基础教程是概述的相关黑帽搜索引擎优化 ...

  4. 程序人生:黑帽seo新手入门基础教程 1

    黑帽搜索引擎优化新手入门基础教程 从原理来看,使用黑帽搜索引擎优化技术做排名,与白帽搜索引擎优化是一样的.从细化的操作来看,则有很大的不同.黑帽搜索引擎优化新手入门基础教程是概述的相关黑帽搜索引擎优化 ...

  5. JCL新手入门学习教程(1) 2021-02-09

    JCL新手入门教程 一.JCL介绍 JCL作业控制语言(Job Control Language) 定义和控制程序的执行,以根据输入获得所需的输出 是一组步骤,其中每个步骤都有一个特定的任务要完成,也 ...

  6. C# Cad二次开发新手入门系列教程(一)开发环境搭建

    目录 前言 开发需要做什么准备? 编写自己的第一个程序 前言 本课程主要针对刚接触Cad二次开发或者准备入门Cad二次开发的朋友,笔者是用的C#进行开发,在该系列教程内,笔者会带着大家从最基础的开发到 ...

  7. 新手做seo该怎么做?seo新手入门基础教程

    SEO作为一种获取搜索引擎流量的手段,一度受到很多人的追捧.如果做得好,效果是好的.但是基本的入门知识也很重要.只有掌握了基本的入门知识,才能取得好的效果.[百度SEO快排]战神快排小编整理发布. 学 ...

  8. Altium Designer 17 新手入门详细教程

    本套Altium Designer视频可以说是目前全网最新,最全,最接地气的一套入门视频,欢迎各位Altium Designer粉丝们收藏和转发,让更多菜鸟看到这么好的资源. 以最菜鸟的基础.通俗易懂 ...

  9. 一学就会——vim新手入门图文教程

    很多教程一上来就是介绍vim的三种模式,新手看着头都大.再加上鼠标不能用,打开vim后,鼠标点来点去,啥也做不了,想放弃又不甘心. 没关系--咱们来一起解决这个问题,还有对应的视频教程,喜欢的可以支持 ...

  10. 易语言零基础新手入门系列教程 第一课

    机器人小鑫易语言源码(作业用): 机器人小鑫源码 - 第一课.zip 视频教程文字版: 新手学习易语言的几点建议 1.由浅入深.由易到难.循序渐进,切勿急功近利,想一步登天! 这是学习的一般规律,学习 ...

最新文章

  1. 算法基础(09)— 字符串常用操作
  2. 远程办公还将持续,智办事助力企业团队协作难点“破冰”
  3. 技术 | Web前端开发(4)持续更新
  4. 【37.50%】【codeforces 745B】Hongcow Solves A Puzzle
  5. Web 前端——项目文件夹命名规范
  6. redux进一步优化
  7. 蓝牙芯片排行_7月TWS 全球品牌出货量排行榜出炉
  8. C++笔记-使用std::funcional代替函数指针
  9. 宝塔linux面板安装seafile,Centos7 安装seafile 企业共享网盘
  10. 如何在Git上创建工程,演示在Git中创建项目
  11. [原创]Linux下网络性能测试Netperf工具介绍及安装
  12. 最速下降法/steepest descent,牛顿法/newton,共轭方向法/conjugate direction,共轭梯度法/conjugate gradient 及其他
  13. 中国联通创维SK-D740光猫管理员密码获取教程
  14. 百度地图开发:Label文本居中
  15. Button 英文大写问题
  16. JavaScript展示商品详情图
  17. 如何计算变量或数据类型所占内存空间的大小
  18. ZeroMQ 中文指南 第一章 ZeroMQ基础【转载】
  19. 下单以及订单处理流程描述
  20. [深度学习] PyTorch 实现双向LSTM 情感分析

热门文章

  1. 数字电视系统显示格式标准(D1/D2/D3/D4/D5)对比解释
  2. 保姆级的Arduino循迹小车研发日志及一些坑(其中包含L298N、Arduino、TCRT5000以及1:48的TT电机的使用)
  3. 手把手教你自学单片机,三个步骤请做好笔记
  4. 【电力电子技术AC-DC】三相桥式晶闸管整流电路(阻性/阻感性负载)simulink仿真
  5. Unicode 字符编码表
  6. 23个适合logo设计的常用英文字体
  7. Sailfish OS构建(1)
  8. win8计算机无法安装打印机驱动程序,win8.1安装打印机驱动的方法 惠普打印机驱动程序安装教程...
  9. 网吧服务器ip地址修改,详解修改BXP服务器IP地址的方法
  10. Javaweb在线视频学习网站的设计与实现