Makefile教程整理

Makefile上部一部分的教程

为了防止杠精,这里再重申一下,本博客的内容都是来自陈皓大神的博客,我只是记录下自己的学习笔记。

Makefile教程5:静态模式,多目标,自动依赖

Makefile教程5

静态模式

在开始前介绍两个值:

  • $@代表所有的目标
  • $<代表所有的依赖文件

看一个最简单的例子,文件结构如下:

.
├── functions.c
├── main.c
└── makefile

其中functions.c:

int addSum(int a,int b){return a+b;
}

其中main.c:

#include <stdio.h>extern int addSum(int,int);int main(int argc, char const *argv[])
{printf("1+2=%d\n",addSum(1,2));return 0;
}

其中makefile,其中需要用到前面介绍过的makefile自动推导

object = main.o functions.o
# 这里就是靠自动推导
main: $(object)
# 这里就是静态模式,下面介绍
$(object): %.o : %.cgcc -c $< -o $@

这里我把变量去掉:

# 这里就是靠自动推导
main: main.o functions.o
# 自动推导规则时,走到这里
main.o functions.o: %.o : %.cgcc -c $< -o $@

这里最迷糊的部分就是:

main.o functions.o: %.o : %.c

是什么意思,这就是静态模式,它的结构用中文描述就是:

目标集和:匹配模式(匹配目标集和中的一些目标):所需文件(上一步筛选出的那些目标所依赖的文件)

上面的结果中是不是有一些变量:

  • 匹配模式下匹配到的目标:$@
  • 所依赖的文件:$<

所以上面的:

# 这里就是靠自动推导
main: main.o functions.omain.o functions.o: %.o : %.cgcc -c $< -o $@
# $< 就是 main.c functions.c
# $@ 就是 main.o functions.o

这里再贴一下完整版:

main: main.o functions.ogcc main.o functions.o -c mainmain.o: main.cgcc -c main.c -o main.ofunstions.o: functions.cgcc -c functions.c -o functions.o

静态模式很适合多个目标拥有类似的依赖,就可以通过匹配来实现。

这里贴一下原本博客中的解释:

多目标

这个其实在上面的静态模式中就出现了:

main.o functions.o: %.o : %.cgcc -c $< -o $@

在目标位置是不是不止一个目标,有两个目标:main.o functions.o

自动依赖

看不懂。。。。。。

Makefile教程6:命令相关内容,命令包,export

makefile教程6

不显示命令

不显示命令:@符号,就是只要在命令前加上这个参数,就不会将当前命令打印在命令行中:

object = main.o functions.omain: $(object)$(object): %.o : %.cgcc -c $< -o $@.PHONY:
clean:@rm -rf *.oreset:rm -rf *.o main

比如上面的文件中,现在运行:

make clean

页面上就不会显示:

rm -rf *.o

了。

make的指令:-s或者--slient就是全面禁止输出命令,跟上面能有类似的效果。


是否执行命令

make 指令:-n或者--just-print参数,就是仅显示执行的命令,但是不执行,可以用于调试。


命令之间的关联

命令之间的关联:;,就是你想要两条命令连在一起执行时,就需要这个参数,比如下面这个:

object = main.o functions.omain: $(object)$(object): %.o : %.cgcc -c $< -o $@.PHONY:
pwd1:cd ../pwdpwd2:cd ../;pwd

试问,make pwd1make pwd2有什么区别呢?就是pwd1cd ../是不会影响接下来的命令pwd的。


命令出错

简单来说就是,如果不指明,make会在其中一个命令出现错误后,就立即停止,但是有的时候一些命令出错是没有问题的,这个时候就要用到这个东西,比如下面这个makefile文件:

object = main.o functions.omain: $(object)$(object): %.o : %.cgcc -c $< -o $@.PHONY:
init:mkdir ./result@echo "result目录创建完成"

第一次运行make init的时候是成功的,但是第二次运行,就会出现这个错误:

mkdir ./result
mkdir: ./result: File exists
make: *** [init] Error 1

但是因为这个目录原先就存在,所以不需要重新创建,这个命令出错也没有关系,但是又不想写条件判断,就可以使用-符号,代表这个命令执行失败也继续执行:

object = main.o functions.omain: $(object)$(object): %.o : %.cgcc -c $< -o $@.PHONY:
init:-mkdir ./result@echo "result目录创建完成"

这个时候该有的报警还是会有,但是makefile会继续执行:

mkdir ./result
mkdir: ./result: File exists
make: [init] Error 1 (ignored)
result目录创建完成

命令包

这个简单来说就是可以定义一系列的指令,然后用变量的方式使用,它的结构如下:

# define 命令包的名字,就是变量名
define printPoem# 这里开始编写对应的命令@echo "结庐在人境,而无车马喧。\n";@echo "问君何能尔?心远地自偏。\n";@echo "采菊东篱下,悠然见南山。\n";@echo "山气日夕佳,飞鸟相与还。\n";@echo "此中有真意,欲辨已忘言。\n";
# 命令包结束符
endef

比如下面的内容:


define printPoem@echo "结庐在人境,而无车马喧。\n";@echo "问君何能尔?心远地自偏。\n";@echo "采菊东篱下,悠然见南山。\n";@echo "山气日夕佳,飞鸟相与还。\n";@echo "此中有真意,欲辨已忘言。\n";
endef.PHONY:
debug:# 像使用变量一样使用$(printPoem)

然后直接运行:make debug就可以看到命令包被全部执行了。

export

这个教程很多,都介绍的超级难,但是我这里只是想要简单介绍这个关键字的作用,就是在一个make的过程中,将变量不仅仅局限在一个makefile文件中。

这里扯出了,不止一个makefile文件,前面面临多个makefile文件的情况就是include的时候include链接在这里,但是include的本质是将对应文件包含进来,而export更像是将这个变量变成一个全局变量。

其次就是如何在一次make中编译两个makefile文件呢?下面演示一下:

这是代码结构,然后这里就重点展示一下两个makefile。

首先是最外面的makefile,注意看其中的注释:

# 这里首先是定义了变量,接下来就是将这些变量升级成全局变量
export cc = gcc
export param = -c
export output = function.o
# 编译入口
main: main.o $(output)$(cc) main.o ./src/$(output) -o mainmain.o: main.c$(cc) $(param) main.c -o main.o$(output):# 重点!!!这里就实现了在一次make中,make另一个文件,就是在 src 目录下的那个文件cd ./src;make.PHONY:
clean:rm -rf ./src/*.o ./*.orm -rf main

这里展示src目录下的那个makefile文件:

src: function.c# 这里使用的变量都来自于上一个 makefile 中 export 的$(cc) $(param) function.c -o $(output)

export的作用简单来说就是将一个变量升级为全局变量,在本次编译中其他makefile文件也可以使用。

Makefile教程整理:5,6相关推荐

  1. makefile教程链接

    makefile makefile教程2(haoel/陈皓) Makefile教程1(转载+标注)

  2. 真·干货!这套深度学习教程整理走红,从理论到实践的带你系统学习 | 资源...

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 寒假/春节小长假给自己充电的真·干货来了. 如果你想要的是一份从理论到实践的深度学习教程清单,如果你想系统了解各类框架.基础网络与各种使用场 ...

  3. makefile教程_Makefile教程

    makefile教程 Make is a utility that automatically builds executable programs and libraries from source ...

  4. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序...

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

  5. linux下如何make文件夹,Linux makefile 教程 非常详细,且易懂

    http://blog.csdn.net/liang13664759/article/details/1771246 Linux makefile 教程 非常详细,且易懂 1.Makefile用途 使 ...

  6. W3School教程整理

    W3School 教程整理 前端教程合集 在线浏览 AngularJS教程 Bootstrap教程 CSS参考手册 Foundation 教程 Highcharts 教程 HTML教程 CSS教程 F ...

  7. (面试必备)软件测试人员必备Linux命令操作(根据菜鸟教程整理更易查阅)

    菜鸟教程地址:http://www.runoob.com/linux/linux-command-manual.html 本文根据菜鸟教程整理比较常见的命令,更方便平时的查阅. 命令:cat cat ...

  8. 110个Photoshop手绘系列教程整理

    [转自]http://68ps.5d6d.com/thread-14859-1-1.html 大家好,今天我为大家整理了110个Photoshop手绘系列教程整理,前面我整理过最新的130个Photo ...

  9. makefile的使用方法(简单视频教程以及详细文字教程)(makefile教程、makefile教学)

    文章目录 1.makefile详细文字教程 2.makefile简单教程(B站视频教程) makefile基本语法格式: 简单示例(单文件)makefile写法 带包含关系的多文件makefile写法 ...

最新文章

  1. CDMA模块上网设置的过程
  2. GDUT1169:Krito的讨伐(树 + 优先队列)
  3. python中da_Python中字符的编码与解码
  4. Java 数字相关操作通用类 NumberUtils.java
  5. thinkphp日志泄漏漏洞_ThinkPHP框架被爆任意代码执行漏洞
  6. vb 通过php连接mysql数据库连接_PHP连接MySQL数据库的几种方法
  7. 创建单IP的***网络
  8. 从aspx后台页面向浏览器输出js文件
  9. 深入剖析 redis 主从复制
  10. php ziparchive类,PHP Zip ZipArchive 类_编程学问网
  11. html文本图片如何排版,【姿势】10种照片的文字排版
  12. springboot工作流程
  13. 焦作大学计算机专业分数线,焦作大学历年分数线 2021焦作大学录取分数线
  14. android 方向传感器应用
  15. 【观察】新华三:云智原生,重塑未来
  16. 河北科技师范学院计算机在哪个校区,河北科技师范学院怎么样有几个校区?属于几本?在河北省排名第几...
  17. 用电脑玩创造与魔法还要申请模拟器白名单?不存在的
  18. 关于云开发数据库的使用经验和建议
  19. MIME Types MIME 类型
  20. 怎样查看服务器操作系统密码,IIS提示:您未被授权查看该页 并弹出输入用户名密码Windows服务器操作系统 -电脑资料...

热门文章

  1. 趣味三角——第9章——Zeno错失无穷小
  2. Lucene 索引文件之kddkdikdm
  3. 站帮微管家最新谍报 更新诸多模块
  4. 2022最新WIFI大师小程序独立版V3.0.8版
  5. Java:异常的处理(加深理解)
  6. python百钱买百鸡问题算法_好玩的Python:植树问题,平闰年,鸡兔同笼,百钱白鸡,属相问题...
  7. 黄灵 | 敏捷团队的激励手段
  8. 天创速盈:如何成功打造爆单商品?
  9. 借呗逾期是如何催收的?
  10. 龙迅LT2611UX—LVDS至HDMI2.0转换器概述资料分享