1、Makefile的应用
  我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。
2、Makefle简单例子的深入学习
  程序概述:为了连接makefile的流程,我将最简单的程序“hello wrold!”分成两个.c文件,并最终在main中进行编译。
  以下都是对同个文件进行makefile的编译,知识makfile编写回比较贴近shell脚本的语法
  如果没有指定输出项目的时候Make会自动找到makefile中第一个目标中没有通配符的目标进行构造,所以步骤是:
  例子1:
  终端界面的命令格式

  gcc -o hello main.c hello.c wrold.c

  注释:gcc 代表的是编译器类型

  -o 表示生成可执行文件
  hello 表示生成的可执行文件的名称
  *.c 表示c程序文件

  例子2:
  接下来我们编写Makefile文件

  hello: main.c hello.c wrold.c
  gcc -o hello main.c hello.c wrold.c

  注释:它主要分成了三个部分

  第一行冒号之前的hello,我们称之为目标(target),被认为是这条语句所要处理的对象,具体到这里就是我们所要编译的这个程序hello。
  冒号后面的部分(main.c hello.c wrold.c),我们称之为依赖关系表,也就是编译hello所需要的文件,(此部分是可以省略的)
  命令部分,相信你也看得出这就是一条编译命令。现在我们只要将上面这两行语句写入一个名为Makefile或者makefile的文件,然后在终端中输入make命令,就会看到它按照我们的设定去编译程序了。
  请注意,在第二行的“gcc”命令之前必须要有一个tab缩进。语法规定Makefile中的任何命令之前都必须要有一个tab缩进,否则make就会报错。
  

  例子3:
  接下来我们使用shell脚本语言对于makefile进行更改

  cc = gcc
  prom = hello
  source = main.c hello.c wrold.c   $(prom): $(source)
  $(cc) -o $(prom) $(source)

  注释:$(名字) 代表一个变量,shell脚本在执行这个变量时,会进行替换

  cc、prom以及source。它们分别告诉了make我们要使用的编译器、要编译的目标以及源文件
  

  例子4:
  对于一个文件的修改,需要重新编译整个流程(其他的.c文件也需要编译)

  cc = gcc
  prom = hello
  objs = main.o hello.o wrold.o   $(prom): $(objs)
  $(cc) -o $(prom) $(objs)   main.o: main.c
  $(cc) -c main.c   hello.o: hello.c
  $(cc) -c hello.c   wrold.o: wrold.c
  $(cc) -c wrold.c

  注释:标准的编译过程中,源文件往往是先被编译成目标文件,然后再由目标文件连接成可执行文件的。我们可以利用这一点来调整一下这些文件之间的依赖关系。

  总工程通过.o文件进行编译的话,如果.c文件没改变,那么原先的.o可以继续使用,不需要重新编译。
  

  例子5:
  我们发现许多类型重复的语句,这样的效率并不高,可以将类型一样的语句整合到一起

  cc = gcc
  prom = hello
  objs = main.o hello.o wrold.o   $(prom): $(objs)
  $(cc) -o $(prom) $(objs)   %.o:%.c
  $(cc) -c $< -o $@

  注释:makeefile中使用的”%“通配符和系统中“*”通配符的区别:

  %.o:%.c的的意思是,“%”代表通配符的意思,等价于% =任意字符(比如main,hello等),当然结尾的格式要一样
  $@:目标的名字($@代表的是当前语句的目标,即%.o)
  $^:构造所需文件列表所有所有文件的名字
  $<:构造所需文件列表的第一个文件的名字
  $?:构造所需文件列表中更新过的文件

  例子6:
  增加自动清理编译结果的功能就可以为其定义一个带伪目标的规则

  cc = gcc
  prom = hello
  objs = main.o hello.o wrold.o   %.o:%.c
  $(cc) -c $< -o $@   $(prom): $(objs)
  $(cc) -o $(prom) $(objs)   #%.o:%.c
  # $(cc) -c $< -o $@   clean:
  rm -rf $(prom) $(objs)

 注释:有了上面最后两行代码,当我们在终端中执行make clean命令时,它就会去删除该工程生成的所有编译文件。

  而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)
  

  例子7:
  自动扫描当前文件夹下的.c或.h文件

  cc = gcc
  prom = hello
  deps = $(shell find ./ -name "*.h")
  src = $(shell find ./ -name "*.c")
  objs = $(src:%.c=%.o)   $(prom): $(objs)
  $(cc) -o $(prom) $(objs)   %.o:%.c
  $(cc) -c $< -o $@   clean:
  rm -rf $(prom) $(objs)

  注释:$(shell find ./ -name "*.h") //意思是寻找当前文件夹下的.h文件

    $(src:%.c=%.o) //将src中的.c结尾的变量名字替换成.o结尾的名字

从gcc到Makefile简易版的更多相关文章

  1. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  2. MVC 验证码实现( 简易版)

    现在网站上越来越多的验证码,使用场景也是越来越多,登陆.注册.上传.下载...等等地方,都有可能大量使用到验证码,那么制作验证码到底有多简单呢?我们一起来看下最简易版的验证码实现过程- 验证码的基本步 ...

  3. 简易版自定义BaseServlet

    这几天在学Java Web,一直在思考Servlet重用的问题,就用java的反射机制实现自定义的简易版BaseServlet; 该方式有点像struts2 利用映射获取前端的参数.有兴趣的同学可以自 ...

  4. Gcc的Makefile简单使用

    Gcc的Makefile简单使用http://blog.chinaunix.net/uid-9330295-id-2425867.html

  5. 简易版的TimSort排序算法

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 简易版本TimSort排序算法原理与实现 TimSort排序算法是Python和Ja ...

  6. html5 canvas简易版捕鱼达人游戏源码

    插件描述:html5利用canvas写的一个js版本的捕鱼,有积分统计,鱼可以全方位移动,炮会跟着鼠标移动,第一次打开需要鼠标移出背景图,再移入的时候就可以控制炮的转动,因为是用的mouseover触 ...

  7. Python写地铁的到站的原理简易版

    Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...

  8. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  9. C+命令行+方向键=简易版扫雷

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什 ...

随机推荐

  1. Python的IDE之Jupyter的使用

    Python的IDE之Jupyter的使用 今天给大家分享的是Jupyter安装和基本使用教程,同时在我安装的过程中遇到了一些问题,解决方法,一并和大家分享 一.Jupyter介绍 Jupyter N ...

  2. docker推送镜像到docker本地仓库报错:http: server gave HTTP response to HTTPS client

    因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误. 解决办法: vim / ...

  3. L1-025. 正整数A+B 简单复习一下,。

    本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...

  4. Java函数式接口

    函数式接口定义且只定义了一个抽象方法.函数式接口的抽象方法的签名称为函数描述符.Java 8的java.util.function包中引入了几个新的函数式接口. 1.Predicate java.ut ...

  5. idea2019 Tomcat9 Tomcat Localhost log 乱码

    网上一顿搜索,基本没用,可能版本不一样. idea2019 tomcat9解决方案: 找到Tomcat的安装目录,进入conf目录 打开logging.properties 找到java.util.l ...

  6. WCF寄宿windows服务一

    如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...

  7. shiro学习(一)

    基础依赖: shiro-core,junit(因为在单元测试中) test.class public class AuthenticationTest { SimpleAccountRealm rea ...

  8. Java必考题目之JVM面试题目和答案

    JVM内存模型 首先我们来了解一下JVM的内存模型的怎么样的: 1.堆:存放对象实例,几乎所有的对象实例都在这里分配内存 堆得内存由-Xms指定,默认是物理内存的1/64:最大的内存由-Xmx指定,默 ...

  9. export CommonJS AMD ES6

    export https://www.cnblogs.com/fayin/p/6831071.html 导入文件: a  -  b  -  c  ,对象隔代消失,可转成函数返回  导入模块对象(命名) ...

  10. 海康RTSP取流URL格式

    预览取流url [海康威视]举例说明: 主码流取流: rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream 子码流取流: rtsp://a ...