首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Linux必备工具】自动化构建工具makefile的使用详解

/filename,其中 filename 是可执行文件的名称,就可以运行程序。...注意:make 默认只生成一个可执行程序 3.1 make/Makefile识别文件新旧 make命令不是每次都会重新编译,只有更改过的文件才会重新编译。...答:通过源文件的修改时间和形成的可执行程序(也是文件)的修改时间做对比。 重新编译的本质:重新写入一个二进制的可执行文件(bin文件),文件的修改时间会跟着更改。...源文件的修改时间 文件的修改时间 第二 ~~ N 次的时候,我们对源文件做任何修改的时候, 源文件的修改时间 > bin文件的修改时间​​​​​ 重新编译形成可执行 大部分情况下重新编译都没问题...通过时间对比,可以做到不让有些代码进行重新编译(不让某些操作进行)。 如上:右边的test被.PHONY修饰,则多次make时,都会执行gcc命令,把可执行程序重新形成。

23210

Linux项目自动化构建工具-makeMakefile

依赖关系和依赖方法 mytest:code.c称之为依赖关系 mytest是目标文件,使用make命令后,生成的运行文件叫mytest code.c是依赖文件列表,如果有多个时使用空格符隔开,例如:code.c...一般清理项目会总是执行,因此习惯上会有:.PHONY:clear 为什么makefile对最新的可执行程序默认不想重新生成 如果项目种存在很多个源文件,如果在这些源文件中只进行了很小的改变,如果去把所有的源文件重新编译一遍...更重要的是,如果每次都重新编译,源代码可能都没有改,重新去编译效率会很低。 这要做的主要目的是提高编译效率。 makefile怎么知道程序需要重新编译?...Modify是修改时间,可执行文件和源代码文件最近修改时间不可能一样 因为永远是先写源代码,即使修改代码,也是先修改,再形成可执行程序。...因此,makefile只需对比可执行文件最近修改时间和源文件最近修改时间,如果可执行文件最近修改时间新,就不需要重新编译;如果源文件最近修改时间新,就需要重新编译。

18210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    京准电钟 | GPS北斗卫星校时服务器在分布式数据网的应用

    如果程序有一百个文件,则不需因为有一个文件发生了较大的变化而重新编译所有文件,从而大大加快了程序员工作的速度。   通常,make程序的工作方式很简单。程序员在修改源文件后,启动nla~e。...Make程序检查源文件及与它相应的目标文件的最后修改时间。...如果源文件input.C的最后修改时间为2151,而相应目标程minput.o的最后修改时间为2150,make程序就可以确定在创建input.o后,修改了源文件input.C,因此要重新编译源文件input...Make程序遍历所有的源文件,找 出需要重新编译的文件,调用编译器编译这些文件。 现在,想象在没有全局—致时间的分布式系统中执行make程序。...make程序就不会重新编译output.c结果,生成的可执行文件就包括由旧的源文件生成的目标文件和新的源文件产生的目标文件。

    8810

    大数据,云计算系统架设卫星授时(GPS北斗时钟)的重要性

    如果程序有一百个文件,则不需因为有一个文件发生了较大的变化而重新编译所有文件,从而大大加快了程序员工作的速度。   通常,make程序的工作方式很简单。程序员在修改源文件后,启动nla~e。...Make程序检查源文件及与它相应的目标文件的最后修改时间。...如果源文件input.C的最后修改时间为2151,而相应目标程minput.o的最后修改时间为2150,make程序就可以确定在创建input.o后,修改了源文件input.C,因此要重新编译源文件input...Make程序遍历所有的源文件,找出需要重新编译的文件,调用编译器编译这些文件。 现在,想象在没有全局—致时间的分布式系统中执行make程序。...make程序就不会重新编译output.c结果,生成的可执行文件就包括由旧的源文件生成的目标文件和新的源文件产生的目标文件。

    61030

    Linux:常用软件、工具和周边知识介绍

    每个使用了静态库的程序都会拷贝一份静态库代码,造成了一定的代码冗余。 使用静态库编译的程序可以在没有任何其他文件的情况下运行。...多个程序可以共享同一个动态库的实例,节省系统资源。 动态库的更新更加灵活,只需要替换动态库文件,不需要重新编译程序。...如果 test.c 发生了变化(例如,被修改或重命名),则需要重新生成 test_make。...否则,如果目标文件的修改时间比源文件的修改时间更晚,make 工具认为该目标文件是最新的,不需要重新构建。 对于可执行文件来说,make 工具也会比较可执行文件和它所依赖的源文件的修改时间。...如果可执行文件的修改时间比源文件的修改时间更晚,或者源文件的修改时间比最新的可执行文件的修改时间更晚,那么 make 工具会重新构建可执行文件。

    27110

    【Linux】常用工具(下)

    ,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。...其实,Makefile 和 make 通过一个文件的内容修改时间不让我们重新重复编译我们的代码,因为我们的文件已经是最新了,没有必要再进行编译。...文件),所以一定能编译成功,如下: 当我们出现了 mytest 文件,mytest 文件的修改时间 > test.c 文件的修改时间; 当我们第 n 次 编译的时候,如果我们没有对 test.c 进行修改...,那么 mytest 文件的修改时间还是大于 test.c 文件的修改时间,此时编译不通过,如下图: 当我们对 test.c 文件进行修改,更新了它的修改时间,此时 test.c 的修改时间 > mytest...下面我们 make 生成可执行程序,然后运行,观察结果: 加载完成后就是上图这样子。这是简单的实现了一个进度条的版本,下面我们进一步改进这个进度条。

    21010

    快速上手makefile自动化构建工具

    文件,写下如下内容: mybin:file.c gcc -o mybin file.c   使用 make 命令进行自动化编译,再运行形成的可执行程序:   以上就是一个简单的自动化编译的过程,其实就是把指令放到文件里去执行...现在我们既可以进行自动化编译,也可以进行自动化清理,例如:   为什么我们自动化编译只需要make,而资源清理却需要make clean?...而当我们对源文件进行修改时,重新再次make又能够生成新的可执行程序,那么make是到底如何识别我更新了程序呢?   ...当文件被访问时,这个时间会被更新。 Change(变更时间):当文件的属性被改变时,那么Change这个时间就会被更新。 Modify(修改时间):代表文件内容的最后修改时间。...当文件的内容被修改时,这个时间就会被更新。

    14110

    Linux项目自动化构建工具-makeMakefile

    一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。...其中 test:test.c 冒号左边是生成的程序名,冒号右边的是程序生成依赖的文件,这一行是依赖关系。而下面一行则是依赖方法,记住,下面一行开头必须是 tab 键。...access:是进入文件的时间,但是当一个系统运行起来的时候,同时会进入非常多的文件,如果每进入一次,就修改大量文件的时间,那么也太浪费性能了,所以就规定了一段时间进入了一定次数后才修改时间。...当可执行文件生成的时候会得到这三个时间,如果我们源文件修改了,时间也会刷新,当源文件的内容修改时间要比可执行文件的时间晚的时候,那么这时候我们输入 make 才会重新编译。...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

    78340

    Linux项目自动化构建工具-makeMakefile

    2; 默认只形成一个目标文件。 我们发现无法对一个依赖文件文件没有修改的目标文件多次进行make。 即无法对新的可执行程序进行重新编译。...那么make和makefile是怎么知道可执行程序是比较新的呢? 这个是对比时间对比出来的,只要可执行程序的最近更改时间,比所有源文件的修改时间都要新,这样就说明他是最新的文件。...那么源文件的修改时间会不会和可执行程序的最近修改时间完全一致呢? 不可能的,程序编译和代码修改都需要时间,逻辑上他们两个的时间根本就不会是一样的。...当多个源文件编译形成可执行程序时,只对其中的一两个文件进行修改时,重新编译源文件时,是全部重新编译还是编译部分? 是对修改源文件进行编译,然后在与之前的源文件编译过的文件进行链接。...我们这里发现 即使Change Time 已经被修改,但是mybin.c 依旧无法被被编译。 所以,可执行程序的文件时间和源文件的文件时间对比的不是Change Time。

    8110

    Linux基础——Linux开发工具(下)_makemakefile

    文件中的第一个指令是可以直接使用make执行,但是注意后面的指令,make后面必须要跟特定的指令 例如: 如果我们这样编写Makefile那直接使用make将会怎么执行 此时,make的功能将不再是生成可执行程序...和makefile总是不让重新编译代码 1.4 文件的三个属性 我们先了解以下系统为什么要在第二次make的时候将我们的请求给拒绝: 从效率上来看:文件在第二次make的时候并没有被修改,所以系统为了提高效率而拒绝...通过一个文件修改的时间 第一次的时候,一定是先有源文件,才有可执行文件 源文件的修改时间文件的修改时间 第二/n次的时候,我们对源文件做任何修改的时候 源文件的修改时间>可执行文件的修改时间...编译重新生成可执行 我们可以直接查看文件的属性: 指令:stat 文件名 stat指令既可以查看源文件属性,也可以查看可执行程序的属性 我们总是说 文件 = 内容+属性 红框里面的三个属性都是表示文件的时间...1.5 makefile的依赖关系 make/makefile兼具推导能力 比如:我们可以写下以下程序 可执行程序mytest的生成依赖.o文件但是此时没有.o文件 就会执行下一条指令,但是.

    22910

    Linux项目自动化构建工具-makeMakefile

    ,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作 makefile 带来的好处就是 ——“ 自动化编译 ” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理。...6.项目清理 此时我将这个程序运行起来,就可以直接运行了,因为这是一个编译好的可执行程序,但是这是一个临时文件,这就意味着我们也需要一个方法能够清理掉这个文件。...像 clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make 执行。...那么make/makefile是如何直到可执行程序是最新的呢?其实是通过对比时间来确定的,只要可执行程序的最新修改时间比源文件的修改时间新,就说明它是最新的。

    12110

    Makefile-只修改了.h头文件,编译为什么不起作用?

    不知道各位小伙伴是否碰到过这样的情况: 一个 .c 文件 include 另一个 .h 头文件,使用 Makefile 来构建(编译)应用程序。 第一次编译、执行,很正常!...但是此时,如果修改了 .h 头文件,再次编译时,就出现问题了: 预期的执行流程是:make 发现 .h 头文件的修改时间更新,于是重新编译包含这个头文件的所有 .c 文件。...也就说明:make 并没有识别出 hello.h 这个头文件已经被改动了,尽管它“应该”可以从文件的修改时间上发现! 为什么会这样?...make 的执行规则是:只有目标文件不存在,或者依赖文件比目标文件更新的时候,才会执行编译指令。 因此,虽然 hello.h 被修改了,但是它并不是目标文件 main.o 的依赖。...文件的依赖中,这样的话,每次修改 .h 文件后,再执行 make 指令时,就可以重新编译 .o 目标文件了。

    4.9K30

    gdb和makefile的讲解

    Linux调试器-gdb使用 gdb可以用于Linux环境下的程序的调试,就例如vs环境下的打断点,然后逐步分析语句等 1 gdb的背景 程序的发布方式有两种,debug模式和release模式 我们在使用...vs21时大家都清楚,release版本是不能被调试的,而debug版本就是用于调试的程序版本 那么我们在Linux系统中默认生成的可执行程序是什么模式呢?...list 打印行号 list 将所有内容和行号一起打印 2.2 run运行程序 r(run) 运行程序 遇到断点停止 2.3 执行语句 n 或 next:单条执行 对应vs里的f10 s或...,哪些文件需要重新编译,甚至于进行更复杂的功能操作 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

    15010

    【Linux操作系统】自动化编译make和Makefile

    二.makefile文件规则 1.基本规则 2.举一个例子 3.伪目标 4.其他规则 三.文件三个时间问题-make程序 1.三个时间何时更新 2.touch的两个作用 3.make程序如何知道依赖文件是否更新...) 读取文件时其改变,比如cat/less,但ls查看文件不会更新时间 Modify(文件修改时间) 文件内容被编辑时其改变,比如vim/touch Change(属性修改时间) 文件属性被修改时其改变...肯定是先有test.c再有test文件,这就意味着一开始, test.c的修改时间一定是比test的修改时间旧....如果make程序发现test的最后一次修改时间居然比test.c的最后一次修改时间旧,那么说明test.c一定在test最后一次修改过后,又修改过,所以make的时候,就能将依赖方法执行成功,反之也成立...到这里我们也能解释为什么.PHONY有一个特点:被.PHONY修饰的总是能被执行,那可能就是.PHONY修饰后不再通过比较test和test.c的修改时间来判断是否要重新编译!

    86040

    【Linux探索学习】第九弹——Linux工具篇(四):项目自动化构建工具—makeMakefile

    ); 5 return 0; 6 } 在之前我们只能通过gcc来编译得到可执行文件,运行可执行文件才能得到结果,如果test.c中的内容进行了改动,就需要重新执行上面的步骤,比较繁琐...,需要下面的指令即可 make clean 这样我们就能删除可执行程序 思考 上面有几个小的知识点值得思考: 1、如果有多层依赖关系怎样处理?...具体点来说就是源文件的修改时间新于可执行文件的修改时间时,就能够再次执行make命令,生成新的可执行文件 我们可以用stat指令来查看文件的时间的相关的信息 stat 文件名 stat可以查看到的信息如下...: 此时源文件的最新修改时间就晚于可执行文件的最新修改时间,所以make就可以执行 以上就是make实现高效编译的方式 四、使用Make的优势 简化构建过程:通过定义规则,开发者可以简化构建过程,只需执行...处理依赖关系:Make会自动处理文件之间的依赖关系,只有被修改的文件会被重新编译。 跨平台性:Makefile可以在多种Unix/Linux系统间共享,简化了跨平台开发。

    7610

    深入理解 Linux 文件时间戳:atime、mtime 和 ctime 的概念及应用

    用途: 可以用于记录文件的最近访问时间。 系统管理员或程序可以通过 atime 分析文件的使用频率,从而决定是否清理过时的文件。...Modify Time (mtime) 含义:Modify Time 表示文件内容上次被修改的时间。 触发条件:任何修改文件内容的操作都会更新 mtime,例如编辑文件并保存。...mtime 文件内容被修改时 编辑并保存文件内容 用于跟踪文件内容的最后修改时间;判断是否需要重新编译。...ctime 文件元数据被修改时 chmod 644 filename 用于记录元数据(如权限、所有者)的变化时间。 三者的关系 atime 仅受读取影响,与内容或元数据无关。...例如: output: source.c gcc -o output source.c make 会根据目标文件 output 和依赖文件 source.c 的 mtime 判断是否需要重新编译

    20010

    makefile介绍 通俗易懂

    Make 可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。Make的使用不仅限于程序,它可以适用于任何如果一些文件变化导致另外一些文件必须更新的任务。...这里举一个简单的例子,假设我们把5个C源程序文件和3个头文件编译和连接成为一个FY的目标程序。我们需要写一个Makefile文件来告诉Make怎样运行所需要的杂乱无章的命令。...如果有编译后的目标文件,但此工程的某几个.c源文件被修改了,那么我们只编译被修改的.c文件,并链接目标程序。...如果有编译后的目标文件,但此工程的头文件被改变了,那么需要编译引用了这几个头文件的.c文件,并链接目标程序。 通过上面的这些规则,避免了每次Make都去重新编译或者链接。...只要写好Makefile,无论怎么修改源程序,只要运行下Make命令就自动完成编译和链接,大大提高了项目运行开发的效率。

    87500

    【linux】gcc makefile

    更新和维护:如果库需要更新(例如修复安全漏洞),则必须重新编译和链接整个应用程序。 动态链接 定义:在动态链接中,程序使用的库在编译时不被复制到可执行文件中。...缺点: 运行时依赖:程序运行时必须能够访问它所依赖的动态库。共享动态库,但是一旦动态库缺失,所有的动态链接这个库的程序,都无法执行了!...动态库在运行时被加载,可以被多个程序共享。...make工具使用文件的时间戳来决定哪些目标需要重新构建。具体来说,make会比较目标文件和其依赖文件的修改时间戳。如果依赖文件比目标文件更新,则目标文件需要重新构建。...这个机制是通过以下步骤实现的: 依赖关系解析:make读取Makefile并解析目标文件及其依赖文件的关系。 时间戳比较:make比较目标文件和依赖文件的修改时间戳。

    6710

    自动化构建与进度显示:全面解读 make 与 Makefile

    通过定义编译规则,Make工具可以根据源文件的更新情况,自动决定哪些部分需要重新编译,从而提高开发效率。...clean 的作用是清理生成的 code 文件,但是没有直接跟 code 关联,需要显示调用 make clean 来清除 code 以便重新编译。...访问时间 (Access Time):表示文件内容最近一次被访问的时间。 修改时间 (Modification Time):表示文件内容最近一次被修改的时间。...补充: 执行 make 时,code 被编译成 code.c ,之后当文件内容没有发生更改时,是无法再次 make 的,这是通过比较 code.c 与 code 的修改时间 (Modification...%.o: %.c :所有的.o文件都可以通过对应的.c文件生成 Make 和 Makefile 的优缺点 优点 自动化构建:减少手动输入编译命令的重复劳动。 高效增量编译:仅重新编译必要的文件。

    15010

    【Linux】自动化构建工具-makeMakefile

    要执行clean,就必须这样写make clean 也可以用make mytest这样去运行: makefile它的运行推导规则是:默认从上到下,对makefile文件进行扫描,默认形成第一个目标文件...3.3 PHONY:XXX 当我们在程序里面不加上: 来make一下后,在make一下,发现就不行了: 在程序不被修改时,make后,默认就不会在形成新的可执行程序,它认为没有必要。...这里有一个Modify:文件的最新修改时间: 源代码和可执行程序最近一次形成或者修改的时间一定是不一样的。 每一次都是先写源代码再形成可执行程序。...最终要判断程序是否被编译:只要对比,可执行文件最近修改的时间和源文件最近修改的时间,谁更新。 可执行程序最新就不需要再编了,源文件最新就重新编译一下。...后,在makefile里面写的代码重新编译了,编译后,依此形成了临时文件,并且形成了最终的可执行程序: 运行一下: 重新进入makefile: 1 code.exe:code.o 2

    14110
    领券