网站建设要多久豆瓣,大连网络公司服务,网页发布的步骤,网站备案变更接入文章目录1、什么是Makefile#xff1f;#xff08;1#xff09;makefile关系到了整个工程的编译规则。#xff08;2#xff09;makefile带来的好处就是——“自动化编译”#xff08;3#xff09;make是一个命令工具#xff0c;是一个解释makefile中指令的命令工具2、为…
文章目录1、什么是Makefile1makefile关系到了整个工程的编译规则。2makefile带来的好处就是——“自动化编译”3make是一个命令工具是一个解释makefile中指令的命令工具2、为什么使用Makefile3、gcc输出文件类型及编译与链接1编译即把源文件编译成中间代码文件即 Object File在Windows下是 .obj 文件UNIX下是 .o 文件2链接把大量的Object File合成执行文件3库文件.lib 或 .a4编译与链接的一些常识4、Makefile规则最基本的使用常识1基本规则depend中如果有一个以上的文件比target文件要新的话command所定义的命令就会被执行核心所在2执行顺序Makefile中的第一个目标会被作为其默认目标3Makefile变量相当于C中的宏定义4变量的引用5通配符6简单使用实例前面我们学习工程的编译与调试是通过task.json文件和launch.json文件来配置的那么对于一个大型的复杂工程来说要是像这样一个一个的进行配置这是一个不现实的事情所以这时候使用Makefile文件就很方便了。接下来我们将对Makefile进行简单的认识与学习掌握一些基本的使用方法。
1、什么是Makefile
Makefile有效地描述这些文件之间的依赖关系以及处理命令当个别文件改动后仅执行必要的处理而不必重复整个编译过程可以大大提高软件开发的效率。
1makefile关系到了整个工程的编译规则。
一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作因为makefile就像一个Shell脚本一样其中也可以执行操作系统的命令。
2makefile带来的好处就是——“自动化编译”
一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。
3make是一个命令工具是一个解释makefile中指令的命令工具
一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见makefile都成为了一种在工程方面的编译方法。
2、为什么使用Makefile
对于一个大型软件其编译、维护是一个复杂而耗时的过程。它涉及到大量的文件、目录这些文件可能是在不同的时间、由不同的人、在不同的地方分别写的其中一些是程序有些是数据有些是文档有些是衍生文件。甚至参与开发的人员也不一定清楚所有文件的细节包括如何处理它们。 此外构成软件的文件数目可能达到成百上千甚至成千上万个开发过程中当修改了少量几个文件后往往只需要重新编译、生成少数几个文件。
3、gcc输出文件类型及编译与链接
gcc是编译器编译完后常见的输出文件及其含义如下
1编译即把源文件编译成中间代码文件即 Object File在Windows下是 .obj 文件UNIX下是 .o 文件
1编译时需要告诉编译器头文件的所在位置头文件中应该只是声明而定义应该放在C/C文件中只要所有的语法正确编译器就可以编译出中间目标文件。一般来说每个源文件都应该对应于一个中间目标文件O文件或是OBJ文件。
2链接把大量的Object File合成执行文件
1链接时主要是链接函数和全局变量使用这些中间目标文件O文件或是OBJ文件来链接合成所需要的程序。
3库文件.lib 或 .a
1链接器并不管函数所在的源文件只管函数的中间目标文件Object File在大多数时候由于源文件太多编译生成的中间目标文件太多而在链接时需要明显地指出中间目标文件名这对于编译很不方便所以我们要给中间目标文件打个包在Windows下这种包叫“库文件”Library File)也就是 .lib 文件在UNIX下是Archive File也就是 .a 文件。
4编译与链接的一些常识
1源文件首先会生成中间目标文件再由中间目标文件生成执行文件。 2在编译时编译器只检测程序语法和函数、变量是否被声明。如果函数未被声明编译器会给出一个警告但可以生成Object File。 3而在链接程序时链接器会在所有的Object File中找寻函数的实现如果找不到就会报链接错误
4、Makefile规则最基本的使用常识
1基本规则depend中如果有一个以上的文件比target文件要新的话command所定义的命令就会被执行核心所在 1target目标可以是一个中间文件也可以是最终的执行文件 2depend依赖指要生成目标文件所需要的文件或目标 3commandmake需要执行的命令
2执行顺序Makefile中的第一个目标会被作为其默认目标
默认执行第一条在执行第一条时先找所有的依赖文件如果没有继续往下找有没有脚本能生成这个依赖文件如果有就会先执行下面生成依赖文件的语句make会一层又一层地去找文件的依赖关系直到最终编译出第一个目标文件
使用实例例如这里的prog.o是下个Makefile规则产生的所以到第一个规则的时候找不到依赖项他会继续向下执行
3Makefile变量相当于C中的宏定义
1makefile中的变量是一个字符串可以理解为宏定义 2makefile变量定义的三种形式 OBJ a b c 表示 OBJ 就是 a b c 这三个不能改变了 OBJ : a b c 表示 OBJ 是 a b c 但可以用 再去追加 OBJ d 表示 OBJ 变量添加了 d 这一个
4变量的引用
a变量的命名中对大小写是敏感的即一个小写变量其的大写形式代表的是另一个变量 b变量的声明时需要赋初值使用的时候需要在变量名前加 $ 且最好使用或{}把变量包括起来可以理解为C中的宏定义
5通配符
1% 表示任意一个 2* 表示所有 3 表示匹配一个未知的东西
6简单使用实例 1每一个 .o 文件都有一组依赖文件而这些 .o 文件又是执行文件myproject的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的即目标文件是由哪些文件更新的。
2定义依赖关系后续的那一行定义了生成目标文件的操作系统命令这个操作命令一定要以一个Tab键作为开头。
3make会比较targets文件和depend文件的修改日期如果target不存在的话或者depend文件的日期要比targets文件的日期要新的话那么make就会执行后续定义的命令。
4如果targets所依赖的.o文件不存在那么make会在当前文件中找目标为.o文件的依赖性如果找到则再根据那一个规则生成.o文件。
5clean没有被第一个目标文件直接或间接关联那么它后面所定义的命令将不会被自动执行但是其可以显示调用即make clean命令——来清除所有的目标文件以便重新编译
6隐晦规则只要make看到一个[.o]文件它就会自动的把[.c]文件加在依赖关系中即make找到一个test.o那么test.c就会自动加到对应依赖文件只需要手动添加对应的头文件即可。并且 gcc -c testc 也会被推导出来。所以上面的可以简写为如下形式
以上仅仅是Makefile的简单使用知识 参考链接 https://blog.csdn.net/haoel/article/details/2886 https://blog.csdn.net/weixin_38391755/article/details/80380786/