【1】Makefile
(1)Make简介
1)工程管理器,顾名思义,是指管理较多的文件
2)Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳
自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作
3)Make将只编译改动的代码文件,而不用完全编译。
(2)Makefile基本结构
Makefile是Make读入的唯一配置文件
1)由make工具创建的目标体(target),通常是目标文件或可执行文件
2)要创建的目标体所依赖的文件(dependency_file)
3)创建每个目标体时需要运行的命令(command)
4)注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator. Stop.
Makefile格式
target : dependency_files
command
例子
hello.o : hello.c hello.h
gcc –c hello.c –o hello.o
(3)Makefile变量
一个复杂一些的例子
sunq:kang.o yul.o
gcc kang.o yul.o -o sunq
kang.o : kang.c kang.h
gcc –Wall –O -g –c kang.c -o kang.o
yul.o : yul.c
gcc - Wall –O -g –c yul.c -o yul.o
注释:
-Wall:表示允许发出gcc所有有用的报警信息.
-c:只是编译不链接,生成目标文件”.o”
-o file:表示把输出文件输出到file里
关于更多的用man工具
(4)创建和使用变量
1)创建变量的目的:
用来代替一个文本字符串:
1.系列文件的名字
2. 传递给编译器的参数
3. 需要运行的程序
4. 需要查找源代码的目录
5. 你需要输出信息的目录
6. 你想做的其它事情。
2)变量定义的两种方式
a. 递归展开方式VAR=var
b. 简单方式 VAR:=var

 变量使用$(VAR)用”$”则用”$$”来表示、类似于编程语言中的宏
3)刚才的例子OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gsunq : $(OBJS)$(CC) $(OBJS) -o sunqkang.o : kang.c kang.h$(CC) $(CFLAGS) -c kang.c -o kang.oyul.o : yul.c yul.h$(CC) $(CFLAGS) -c yul.c -o yul.o
4)递归展开方式VAR=var例子:foo = $(bar) bar = $(ugh) ugh = Huh? $(foo)的值为?echo $(foo)来进行查看
5)优点:它可以向后引用变量缺点: 不能对该变量进行任何扩展,例如 CFLAGS = $(CFLAGS) -O 会造成死循环
6)简单方式 VAR:=varm := mm x := $(m) y := $(x) bar x := later echo $(x) $(y) 看看打印什么信息?用这种方式定义的变量,会在变量的定义点,按照被引用的变量的当前值进行展开 这种定义变量的方式更适合在大的编程项目中使用,因为它更像我们一般的编程语言
7)用?=定义变量 dir := /foo/barFOO ?= barFOO是?含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:ifeq ($(origin FOO), undefined)FOO = barendif
8)为变量添加值 你可以通过+=为已定义的变量添加新的值 Main=hello.o hello-1.oMain+=hello-2.o
9)预定义变量AR     库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as。CC     C编译器的名称,默认值为cc。CPP  C预编译器的名称,默认值为$(CC) –E。CXX    C++编译器的名称,默认值为g++。FC     FORTRAN编译器的名称,默认值为f77RM     文件删除程序的名称,默认值为rm -f
10)例子:Hello: main.c main.h <tab> $(CC) –o hello main.cclean:<tab> $(RM) hello
11) 预定义变量ARFLAGS     库文件维护程序的选项,无默认值。ASFLAGS      汇编程序的选项,无默认值。CFLAGS      C编译器的选项,无默认值。CPPFLAGS    C预编译的选项,无默认值。CXXFLAGS    C++编译器的选项,无默认值。FFLAGS      FORTRAN编译器的选项,无默认值。
12) 刚才的例子OBJS = kang.o yul.oCC = gcc  CFLAGS = -Wall -O -gsunq : $(OBJS)$(CC) $(OBJS) -o sunqkang.o : kang.c kang.h$(CC) $(CFLAGS) -c kang.c -o kang.oyul.o : yul.c yul.h$(CC) $(CFLAGS) -c yul.c -o yul.o
13)自动变量$*     不包含扩展名的目标文件名称$+    所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件$<       第一个依赖文件的名称$?    所有时间戳比目标文件晚的的依赖文件,并以空格分开$@          目标文件的完整名称$^     所有不重复的目标依赖文件,以空格分开$%          如果目标是归档成员,则该变量表示目标的归档成员名称
14) 刚才的例子:OBJS = kang.o yul.oCC = gccCFLAGS = -Wall -O -gsunq : $(OBJS)$(CC) $^ -o $@kang.o : kang.c kang.h $(CC) $(CFLAGS) -c $< -o $@yul.o : yul.c yul.h$(CC) $(CFLAGS) -c $< -o $@
15) 环境变量1) make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量2) 如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量
(5) Make使用直接运行make 选项-C dir读入指定目录下的Makefile-f  file读入当前目录下的file文件作为Makefile-i忽略所有的命令执行错误-I dir指定被包含的Makefile所在目录-n只打印要执行的命令,但不执行这些命令-p显示make变量数据库和隐含规则   -s在执行命令时不显示命令-w如果make在执行过程中改变目录,打印当前目录名

【2】Make使用
直接运行make
选项
-C dir读入指定目录下的Makefile
-f file读入当前目录下的file文件作为Makefile
-i忽略所有的命令执行错误
-I dir指定被包含的Makefile所在目录
-n只打印要执行的命令,但不执行这些命令
-p显示make变量数据库和隐含规则
-s在执行命令时不显示命令
-w如果make在执行过程中改变目录,打印当前目录名
【2】Makefile的遗憾规则
隐含规则1:编译C程序的隐含规则
“.o”的目标依赖目标会自动推导为“.c”并且其生成命令是“$(CC) -c $(CPPFLAGS) (CFLAGS)”隐含规则2:链接Object恩建的隐含规则“&lt;n&gt;”目标依赖于“&lt;n&gt;。o”,通过运行C的编译器来运行链接程序生成(一般是“ld”),其生成命令是:“(CFLAGS)” 隐含规则2:链接Object恩建的隐含规则 “&lt;n&gt;”目标依赖于“&lt;n&gt;。o”,通过运行C的编译器来运行链接程序生成(一般是“ld”), 其生成命令是:“(CFLAGS)”隐含规则2:链接Object恩建的隐含规则“<n>”目标依赖于“<n>。o”,通过运行C的编译器来运行链接程序生成(一般是“ld”),其生成命令是:“(CC) (LDFLAGS)&lt;n&gt;.o”“(LDFLAGS) &lt;n&gt;.o” “(LDFLAGS)<n>.o”“(LOADLIBES) $(LDLIBS)”,这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效
例如如下:
规则:
x:x.o y.o z.o
并且“x.c”、“y.c”和“z.c”都存在时,隐含规则将执行如下命令:
cc -c x.c -o x.o
cc -c y.c -o y.o
cc -c z.c -o z.o
cc x.o y.o z.o -o x
如果没有一个源文件(如上例中的x.c)和你的目标名字(如上例中的x)相关联,


【1】VPATH的用法
(1)VPATH:虚路径
1) 在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,
并存放在不同的目录中。所以,当make需要去寻找文件的依赖关系,你可以在文件
前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。
2) Makefile文件中的特殊变量“VPTH”就是文成这个功能的,如果没有指明这个变量,
make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么make就会在当前
目录找不到的情况下,到所指定的目录中去找寻文件了。
3) VPATH = src:…/headers
4) 上面的定义指定两个目录,“src”和“…/headers”,make会按照这个顺序进行搜索。
目录由“冒号”分隔。当然,当目前目录永远是最高的优先搜索的地方

【2】嵌套的Makefaile
(1)案例
- 我们注意到有一句@echo $(SUBDIRS)
- @(RM)并不是我们自己定义的变量,那它是从哪里来的呢?
- make -C $@
- export CC OBJS BIN OBJS_DIR BIN_DIR

C高级-Makefile相关推荐

  1. makefile高级应用

    https://www.zybuluo.com/lishuhuakai/note/206938 make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况 ...

  2. 一个高级的makefile文件

    该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式) ...

  3. 【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

    加qq:1126137994 微信:liu1126137994 一起学习更多技术~ 继续上一篇文章关于变量的学习! 1.环境变量(全局变量) -makefile中能够直接使用环境变量的值 如果make ...

  4. 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上

    抓住基础,学习更多技术,迎接挑战,加qq:1126137994 微信:liu1126137994 一起学习更多技术~ 上一篇文章学习了makefile中的预定义变量的使用,今天来继续学习makefil ...

  5. Linux C语言高级学习第八天(gcc代码优化makefile)

    多个.c文件的混合编译 1.gcc C语言编译器 gcc xxx.c -o xxx -o :指定生成产物的名称 免费.开源.速度快(快30%).占用内存小.gcc代码优化 gcc支持对代码进行三级优化 ...

  6. linux中makefile高级用法--makefile调用makefile

    一.介绍 在大型项目中,makefile调用makefile很常见,也很方便,这里给出调用方法 二.实例 1.代码树 app_top下,有顶层makefile和编译工具的设置文件Rules.make, ...

  7. Cocos2dx-Android 之Makefile通用高级写法

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FI ...

  8. makefile学习(转载)

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...

  9. LINUX动态链接库高级应用

    在< LINUX下动态链接库的创建与应用> 一文中,我介绍了LINUX动态链接库的基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接库操作函 ...

最新文章

  1. python脚本 数据库压力测试_python-网站压力测试脚本
  2. python常见的数据类型_Python中常见的数据类型总结
  3. 百度的TSDB——可针对tag查询,应该类似kairosDB
  4. Install zabbix 2.2 + PostgreSQL + nginx + php on CentOS 6.x x64
  5. gpg加密命令 linux_加密方案 GNUPG amp; Yubikey
  6. MySQL中的条件赋值
  7. 练习C语言二级编程题的一些问题
  8. 科大星云诗社动态20210522
  9. php 字符串判空,php 使用 preg_replace 去除空格后的字符串无法判空
  10. 【转载】静态时序分析
  11. SAP Cloud for Customer Sales Order Requested Date的业务含义和实现
  12. 自制jQuery 复选框全选与反选插件
  13. HNU 实验七 字符串 E-mail地址
  14. OneNET物联网云平台HTTP数据流上传与下发,使用Fiddler调试开关应用,stm32 esp8266物联网家居远程开关
  15. 读写分离oracle redis,redis集群主从之读写分离
  16. 190308每日一句
  17. java+opencv实现人脸识别
  18. 五子棋c语言策划书活动内容,五子棋比赛活动的策划案
  19. 各种Windows版本下载
  20. 基于DSP的主动降噪开发之三(CCS软件学习)

热门文章

  1. Spring Boot如何实现异步执行任务
  2. 基于EfficientDet的医学图像检测(肺炎、肺结节、肺结核等)(VOC2007)
  3. 开源的 .NET 工作流引擎 Elsa 开源
  4. Talend常用ELT功能记录(一)
  5. 高逼格的帧动画-requestAnimationFrame
  6. c语言200例 016 水池注水问题
  7. Android6.0 Reset恢复出厂设置流程分析
  8. JavaScript技术地图,助你走向人生巅峰
  9. Qt之统一的UI界面格式基调,漂亮的UI界面
  10. Windows环境下tensorflow使用GPU加速运算(详细解释)