摘要:
本节我们编写路径搜索相关的makefile,具体需求如下: 1、工程项目中不希望源码文件夹在编译时被改动(只读文件夹)。 2、在编译时自动创建文件夹(build)用于存放编译结果。 3、编译过程中能够自动搜索需要的文件 4、makefile易于扩展,能够复用于相同类型的项目 5、支持调试版本的编译选 阅读全文
摘要:
可见后面的命令会覆盖前面的命令,我们可以得到以下结论: 我们主观上要避免在多处出现同一目标的不同命令,但是在include一个文件时,往往不自觉的引入这种问题,因此,当使用include关键字包含其他文件时,需要确保被包含文件中的同名目标只有依赖,没有命令,否则同名目标的命令将被覆盖。 下面来具体介 阅读全文
摘要:
在实际的工程项目中,源文件和头文件都会组织成一定的目录结构,这样也便于项目的管理,前述我们分析的makefile,源文件和头文件大都在当前目录,没有路径搜索的问题,下面我们引入今天的演示程序的目录结构: 编写makefile并执行make,结果如下: 由于源文件和头文件都组织在了文件夹里,但是mak 阅读全文
摘要:
上一篇中我们初步生成了.dep依赖文件,但是,实际工程中,源文件成千上万,生成的依赖文件需要用文件夹管理起来,也就是在makefile中将.dep文件组织到指定目录。 我们可以通过以下思路来组织.dep文件,当include发现.dep文件不存在时: 1、通过规则和命令创建deps文件夹。 2、将所 阅读全文
摘要:
前面三篇已经把自动生成依赖关系所需要的知识点进行了剖析,本篇就来完成这个完整的makefile程序。 整体的依赖关系如下所示: 目标文件、依赖文件、最终的可执行文件我们都创建对应的文件夹来管理。下面直接给出编写完成的makefile程序: 执行make,输出结果如下图所示: 到目前,一切都很正常,下 阅读全文
摘要:
前面我们涉及到的makefile,都只是考虑到目标文件(.o)依赖于源文件(.c)。然而实际情况却并没有这么简单,我们的源文件一般都是会包含一些自己编写的头文件的,这样的话%.o : %.c这种模式规则的写法是不是就有问题了呢?当源文件不改变而头文件改变时,make解释器是无法根据文件的新旧关系来决 阅读全文
摘要:
为了完成自动生成依赖关系的目的,我们还需要引入几个知识点,下面首先引入makefile中的关键字include。 include关键字: makefile中的include关键字类似于C语言中的include关键字,将其它文件的内容原封不动的搬到当前文件中。具体用法如下所示: *.mk代表当前目录下 阅读全文
摘要:
makefile中支持条件判断语句,具体如下: 注意事项:条件判断语句只能用于控制make实际执行的语句;但是,不能控制规则中命令的执行过程。 条件判断语句的常用语法如下,一般只是用其中的常用形式: 具体的条件判断关键字如下: 编写makefile文件,并执行make,结果如下所示: ifeq、el 阅读全文
摘要:
makefile中支持函数的概念,make解释器提供了一系列的函数供makefile调用,类似于函数库。在makefile中支持自定义函数的实现,并调用执行。通过define关键字实现自定义函数。 自定义函数的基本语法如下: 自定义函数是一个多行变量,无法直接调用,只能在规则中进行调用。自定义函数是 阅读全文
摘要:
在实际的工程项目中,生成的目标文件、最终可执行文件以及其它中间文件都需要进行管理,而不是生成在同一个目录下,本次,我们给出下面的实战需求: 1、自动生成target文件夹存放可执行文件。 2、自动生成objs文件夹存放编译生成的目标文件(*.o)。 3、支持调试版本的编译选项。 4、考虑代码的扩展性 阅读全文
摘要:
环境变量在任何系统同都会存在,它就是系统中预定义的一些键值对,在makefile中可以直接使用系统环境变量的值,但是makefile中若定义了同名的全局变量,那么环境变量将被覆盖,运行make时若指定-e选项,则优先使用环境变量。在makefile中使用环境变量有以下优劣: 如果在多个makefil 阅读全文
摘要:
在makefile中存在一些预定义的变量,它们大体可以分为两类,一类是自动变量,另一类是特殊变量。 自动变量的意义分别如下: 编写如下的makefile程序对自动变量进行测试: 执行make命令,输出结果如下: 小知识: make中的一些特殊变量如下: 编写makefile进行测试: 执行make 阅读全文
摘要:
我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下: 1、make将makefile的目标认为是一个文件; 2、make解释器比较目标文件和依赖文件的新旧关系,决定是否执行命令; 3、make以文件作为第一优先级。 如果不进行特殊的makefile控制,make解释器在解析mak 阅读全文
摘要:
我们在Linux系统中学习C语言或者C++语言时,大多数时候只是用gcc命令或者g++命令在命令行进行简单的编译、链接即可得到最终的可执行文件,进一步即可验证所写C/C++语言的正确性。但是,在大型工程项目中,源文件成千上万,甚至几十万都有可能,如果还是用命令行直接进行编译,这将是一项比南水北调还复 阅读全文
摘要:
makefile用于定义并描述源文件之间的依赖关系,用于说明如何编译各个源文件并生成最终的可执行文件,规则是makefile中的基本组成部分。 一个最基本的依赖规则如下所示: targets代表这个规则的目标,通常是需要生成的目标文件名,或者是make所需执行的命令名称,例如:all。prerequ 阅读全文
摘要:
这一节,我们来真正的读取文件中的内容到内存中,首先来看一下内存布局是什么样的,如下所示: Boot占用了512字节,Fat Table占用了4KB,而真正的文件中的内容,我们把它存在0x9000开始的内存地址处。 加载文件内容的过程如下: 实验步骤如下: 1、在虚拟软盘中创建体积较大的文本文件,使之 阅读全文
摘要:
先上转换图: 重点研究TIME_WAIT状态,根据UNIX网络编程中的思路,TIME_WAIT状态有两个存在的理由: 理由1、 客户端执行主动关闭,假设最终的ACK丢失,服务器将重新发送它的最后那个FIN,因此客户端必须维护状态信息,以允许它重新发送最终那个ACK,要是客户端 不维护状态信息,它将响 阅读全文
摘要:
上一节我们进行了文件的查找实验,文件查找成功了,这一节,我们将文件的内容加载进内存,再一次将整体的流程给出如下: 读取文件的内容时,我们需要根据FAT表找到存储文件内容的每一个扇区,然后进行内容的读取,在上一节中,我们将整个目录区的内容加载到了内存并根据文件名找到了所在的目录项,为了节省内存,我们将 阅读全文
摘要:
上一节我们写了字符串打印的函数和软盘读取函数,在软盘读取函数中,我们是直接给定了要读的逻辑扇区号,这一节我们来实现一个查找文件的功能,也就是根据给定的文件名,在根目录区中查找指定的文件是否存在,涉及到文件名的查找,就会涉及到内存的比较,因此,我们需要实现两个函数,分别为内存比较函数和根目录区查找函数 阅读全文
摘要:
在上一节中,我们成功的将虚拟软盘进行了格式化,而且将文件存入其中,那么如何在根目录区中查找文件呢?为了方便起见,再次给出FAT12文件系统的格式,如下所示: 在FAT12文件系统中,一簇包含一个扇区。从上图可见,目录文件项的偏移为19个扇区,其本身大小占用了14个扇区。根目录区中是一个一个的目录项, 阅读全文