随笔分类 -  6-Make

摘要:Makefile引言 第1课 - make 和 makefile 第2课 - 初识makefile的结构 第3课 - makefile伪目标的引入 第4课 - 变量和不同的赋值方式 第5课 - 预定义变量的使用 第6课 - 变量的高级主题(上) 第7课 - 变量的高级主题(下) 第8课 - 条件判断 阅读全文
posted @ 2020-02-06 23:24 梦心之魂 阅读(210) 评论(0) 推荐(0)
摘要:1.问题:如果我们正在进行的项目需要使用第三方库,那么前几节的makefile能胜任吗? 答案:是否定的。 2.经验假设 本节我们研究第三方库的使用。使makefile支持第三方库。 经验假设: 第三方库通过函数调用的方式提供库中的功能 库文件发布时都附带了声明库函数原型的头文件 编译阶段使用头文件 阅读全文
posted @ 2019-01-22 23:03 梦心之魂 阅读(334) 评论(0) 推荐(0)
摘要:1.问题背景 一般而言,在一个大型项目中,不同工程师负责不同模块的开发;那么问题就来了,我们怎么知道自己编写的这部分代码有没有问题,怎样进行编译?在编译环境中如何支持模块的独立编译? 在大型项目中的代码文件成千上万,完整编译的时间较长; 编写模块代码时,可通过编译检查语法错误; 为了提高开发效率,需 阅读全文
posted @ 2019-01-22 22:52 梦心之魂 阅读(319) 评论(0) 推荐(0)
摘要:22.打造专业的编译环境_下(编译环境重构) 当前整个项目的makefile是否存在潜在的问题?是否需要重构? 22.1.绝对路径问题 所有makefile中使用的编译路径均为写死的绝对路径,一旦项目文件移动,编译必将失败! 22.1.1.解决方案: 在工程makefile中获取项目的源码路径,根据 阅读全文
posted @ 2019-01-21 23:45 梦心之魂 阅读(208) 评论(0) 推荐(0)
摘要:21.打造专业的编译环境_链接 21.1.第二阶段任务 完成整个工程的makefile文件; 调用makefile编译生成静态库文件; 链接所有模块的静态库文件,得到最终的可执行程序。 完成整个工程的makefile文件; 调用makefile编译生成静态库文件; 链接所有模块的静态库文件,得到最终 阅读全文
posted @ 2019-01-21 23:42 梦心之魂 阅读(210) 评论(0) 推荐(0)
摘要:20.0. 实验材料 项目架构: 其中各个文件的内容请自己填写。 20.1.大型项目的目录结构(无第三方库) 20.2.项目架构设计分析 项目被划分为不同的多个模块: 每个模块用一个文件夹进行管理,文件由inc, src, makefile构成 每个模块的对外函数统一放置于common/inc中,如 阅读全文
posted @ 2019-01-21 23:33 梦心之魂 阅读(195) 评论(1) 推荐(0)
摘要:1. 需求分析 (1)工程项目中不希望源码文件夹在编译时被改动(只读文件夹) (2)在编译时自动创建文件夹(build)用于存放编译结果 (3)编译过程中能够自动搜索需要的文件 (4)makefile 易于扩展,能够复用于相同类型的项目 (5)支持调试版本的编译选项 2. 项目类型分析 3. 工具原 阅读全文
posted @ 2019-01-06 16:59 梦心之魂 阅读(159) 评论(0) 推荐(0)
摘要:1. 问题一:当 VPATH 和 vpath 同时出现,make 会如何处理? 工程项目的目录结构如下图所示,src1 和 src2 中都包含了 func.c 文件,如果在 makefile 中使用 VPATH 指定了 src1 ,使用 vpath 指定了 src2,当 VPATH 和 vpath  阅读全文
posted @ 2019-01-06 16:58 梦心之魂 阅读(256) 评论(0) 推荐(0)
摘要:1. 问题:在实际的工程项目中,所有的源文件和头文件都放在同一个文件夹中吗? 在以往的 make 学习中,我们使用到的 .c 文件和 .h 文件都与 makefile 处在同一个路径。在实际的工程项目中,所有的源文件和头文件都放在同一个文件夹中吗? 答案毋庸置疑是否定的,在实际的工程项目中,源文件和 阅读全文
posted @ 2018-11-21 19:19 梦心之魂 阅读(298) 评论(0) 推荐(0)
摘要:1. 深入理解隐式规则 当make发现目标的依赖不存在时: 1) 尝试通过依赖名逐一查找隐式规则 2) 并且通过依赖名推导可能需要的源文件 2. 隐式规则的副作用 编译行为难以控制:大量使用隐式规则可能产生意想不到的编译行为 编译效率低下:make从隐式规则和自定义规则中选择最终使用的规则,编译效率 阅读全文
posted @ 2018-09-06 00:01 梦心之魂 阅读(224) 评论(0) 推荐(0)
摘要:1. 问题 如果把同一个目标的命令拆分的写到不同地方,会发生什么? 执行make all 这个实验表明了:如果同一个目标的命令拆分的写到不同地方,那么 make 会覆盖之前的目标对应的命令,使用最新出现的目标对应的命令。 makefile 中出现同名目标时 — 依赖: 所有的依赖将合并在一起,成为目 阅读全文
posted @ 2018-09-06 00:00 梦心之魂 阅读(287) 评论(0) 推荐(0)
摘要:1.疯狂想法的具体实现 注意事项: 当.dep文件生成后,如果动态的改变头文件间的依赖关系,那么make可能无法检测到这个改变,进而做出错误的编译决策。 解决方案: 将依赖文件名作为目标加入自动生成的依赖关系中 通过include加载依赖文件时判断是否执行规则 在规则执行时重新生成依赖关系文件 最后 阅读全文
posted @ 2018-09-05 23:58 梦心之魂 阅读(170) 评论(0) 推荐(1)
摘要:1. 问题引入———如何在makefile中组织.dep文件到指定目录? 解决思路: 当include发现.dep文件不存在时: 1)通过规则和命令创建deps文件夹2)将所有.dep文件创建到deps文件夹3).dep文件中记录目标文件的依赖关系 初步代码设计: 编程实验:makefile.1 运 阅读全文
posted @ 2018-09-05 23:57 梦心之魂 阅读(320) 评论(0) 推荐(0)
摘要:1. makefile中的include关键字 类似C语言中的include 将其他文件的内容原封不动地搬入当前文件 类似C语言中的include 将其他文件的内容原封不动地搬入当前文件 make对include关键字的处理方式:在当前目录搜索或指定目录搜索目标文件: 1)搜索成功:将文件内容搬入当 阅读全文
posted @ 2018-09-05 23:56 梦心之魂 阅读(224) 评论(0) 推荐(0)
摘要:1. 值得思考的问题 (1)目标文件(.o)是否只依赖于源文件(.c)? 源文件和头文件 (2)编译器如何编译源文件和头文件? 2. 编译行为带来的缺陷 (1)预处理器将头文件中的代码直接插入源文件 (2)编译器只通过预处理后的源文件产生目标文件 综合上面两点,规则中只以源文件为依赖,命令可能无法执 阅读全文
posted @ 2018-09-05 23:55 梦心之魂 阅读(220) 评论(0) 推荐(0)
摘要:1. 实战需求 (1)自动生成 target 文件夹存放可执行文件 (2)自动生成 objs 文件夹存放编译生成的目标文件(*.o) (3)支持调试版本的编译选项,支持打印调试信息 (4)考虑代码的扩展性 ————> 使用变量 2. 工具原料:两个预定义的函数 — $(wildcard _patte 阅读全文
posted @ 2018-09-05 23:54 梦心之魂 阅读(245) 评论(0) 推荐(0)
摘要:1. makefile中的函数 (1)make 解释器提供了一系列的函数供makefile 调用 (预定义函数/库函数) (2)在 makefile 中支持自定义函数实现,并调用执行(自定义函数) (3)通过 define 关键字实现自定义函数 2. 在 makefile 中自定义函数 2.1 自定 阅读全文
posted @ 2018-09-05 23:52 梦心之魂 阅读(306) 评论(0) 推荐(0)
摘要:1. makefile中的条件判断语句 (1)makefile 中支持条件判断语句 — 可以根据条件的值来决定 make 的执行 — 可以比较 两个不同变量 或者 变量和常量值 方法 ifxxx (arg1,arg2) # for true else # for false endif (2)注意事 阅读全文
posted @ 2018-07-08 22:02 梦心之魂 阅读(290) 评论(0) 推荐(0)
摘要:1. makefile中的环境变量(全局变量) (1)makefile中使用系统环境变量 makefile中可以直接使用系统中的环境变量(系统环境变量的本质就是全局的键值对) 如果 makefile 中定义了同名变量,那么环境变量将会被覆盖 运行 make 时指定 "-e" 选项,优先使用环境变量 阅读全文
posted @ 2018-07-08 22:01 梦心之魂 阅读(234) 评论(0) 推荐(0)
摘要:1. makefile中变量的替换 1.1 变量值的普通替换 (1)使用指定字符(串)替换变量值中的后缀字符(串) (2)语法格式: $(var:a=b) 或 ${var:a=b} 替换表达式中不能有任何的空格 make 中支持使用 ${} 对变量进行取值 替换表达式中不能有任何的空格 make 中 阅读全文
posted @ 2018-07-08 22:00 梦心之魂 阅读(242) 评论(0) 推荐(0)