20181108_Makefile知识点
1. = := += ?= 得不同用法
= 作用全部makefile文件
:= 有时间元素
+=
?= 如果没有赋值过,就赋值后面的值
2. @的用法
@放在行首,表示不打印此行。默认在编译的过程中,会把此行的展开效果字符串打印出来。
@ echo hello 在命令行执行make 只打印出一行hello.如果不加@,会打印出 echo hello ,然后再打印hello
3. MAKE和make的关系
MAKE其实是一个变量,里面的值是make。$(MAKE) -C ./xx ;就是先cd ./xx目录下 在执行make
在Makefile中写$(MAKE) -C 和 make -C 效果是一样的
4. make -f -C
$(MAKE) -f ./gouge/haohao.mk 跳到./gouge/目录下 ,把haohao.mk文件指定成make文件,执行haohao.mk文件。不会执 行其他文件包括该目录下的Makefile
$(MAKE) -C ./gouge/ 跳到./gouge/目录下 ,搜索Makefile文件,找到后执行。如果找不到则make失败
5. makefile中-I -L -i区别
-I(头文件目录): INCS += -I/home/haohao/include/ 寻找头文件时除了默认路径下搜,还会到该目标目录下搜索。且目标目录 优先级高于默认目录 /usr/include/ /usr/local/include
-L(库目录) : LIBS += -L/home/haohao/lib/ 指定库文件的目录,包含静态和动态,除了默认路径下搜,还会到该目标目 录下搜索。且目标目录优先级高于默认目录 /lib /usr/lib /usr/local/lib
-l(小写L,库) : LIBS += -lhaohao 在-L指定的目录和默认目录下寻找libhaohao.so的动态库,
6. -Wl,-rpath=./和-Wl,-rpath-link 的作用
-Wl,-rpath-link 编译时指定间接引用库位置,比如直接引用库用-la指定,那么liba.so依赖的库目录就要用-Wl,-rpath-link指定.
-Wl,-rpath作用1和-Wl,-rpath-link一样,作用2 程序运行时默认到环境变量LD_LIBRARY_PATH目录下去找动态库,如果动态库的目录没有添加到LD_LIBRARY_PATH中则需要用-Wl,-rpath 指定;
-rpath和-L不同 -L是为链接的时候指定直接动态库 -rpath-link链接的时候指定间接动态库 , -rpath是为程序运行指定动态库
-Wl选项告诉编译器将后面的参数传递给链接器。 建议:编译命令中使用-Wl,-rpath-link 指定间接引用库位置(编译时),使用-Wl,-rpath 指定引用库位置(运行时),-Wl,-rpath-link在前
7. sed
sed 是编辑工具和vim差不多,只是VIM我们人在命令行输入,sed可以用脚本蝎
sed -i 's/aa/nnn/g' ./a.txt s表示替换指令 ;aa是要被替换成nnn的 ;g表示的字符都要替换,如果没有g 一行中有多个aa的 话只会替换第一个 ; -i 直接修改读取的文件内容,而不是输出到终端 sed -e :表示直接在命令列模式上进行 sed 的动作编辑,即直接在命令行上修改;
8. source和./的区别
./执行后不会影响当前shell环境变量,但是source会
9. -include 和 include区别
通常Makefile中可使用“-include”来代替“include”,忽略文件不存在或者无法创建时的错误提示(“-”的意思是告诉make,忽略 此操作的错误。make继续执行)
10. gcc后面跟 -fno-builtin 和-fno-builtin-printf 的区别
-fno-builtin的含义是不使用C语言的所有内建函数,-fno-builtin-printf的含义是不使用内核的printf函数但是其他的还是使用的
11. addprefix 作用是什么 $(addprefix 要添加的字,被添加的原料)
addprefix是用来添加前缀的,可以理解为文件名字处理。 比如INCLUDE_FLAG=$(addprefix -I,${INCLUDE_DIR});这句话 表示INCLUDE_DIR这个变量里的所有文件的名字前面加上-I, 如果INCLUDE_DIR中有a.h,处理后就变成了-Ia.h;逗号后 面如有多个变量则需要用空格隔开。
12. filter 作用是什么 $(filter 满足的条件, $(source))
filter函数是过滤后面的字符串,返回符合的字符串 比如:source := a.s b.c c.cpp $(filter %.c %.s, $(source)) 返回的是a.s b.c
13. patsubst 作用是什么 $(patsubst 替换前,替换后,需要替换的集合)
patsubst替换字符创,$(patsubst %.c,%.o,x.c.c bar.c) 把字串“x.c.c bar.c”中以.c结尾的单词替换成以.o结尾的字符。函数的返 回结果是“x.c.o bar.o”
14. dir的作用是什么
$(dir $@) 返回文件名序列<names>所在的目录。$(dir src/foo.c hacks)返回值是“src/ ./”。
15. -fPIC 编译选项的作用
加-fPIC生成位置无关代码。如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码 段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决 于 这个.so文件代码段和数据段内存映射的位置.
16. -MMD编译选项 是什么
生成目标文件依赖关系的文件,这个文件给我们分析用,其他没什么用。格式是-MMD逗号后面加文件名字。 -Wp,-MMD,$@.d 其中-wp当做格式来理解。 -M -MD 都是差不多的,只有少量区别。
17. -MT -MF
用法-MT,$@ 或者$"$@";MT和MF都是作用在16条中生成的.d文件中的的名字格式。研究意义不大,如-MT,$@12,表示在.d文 件中目标的名字就是a.c12这样,MT 类似。
18. $(@D)、$(@F)
$(@D)便是目标路劲的路径部分,最后的斜杠去掉;$(@F)表示目标中的文件名字。如/home/main.o:mian.c为Makefile中的一 个目标,则$(@D)=/home $(@F)=main.o.如果目标中没有目录则$(@D)=./
19. \ 在Makefile中的用法
haohao \
hh: 表示这个目标有2个名字,make haohao 和make hh 都是执行同一个
20. CURDIR 这个目录是哪里来的?
$(CURDIR)这个目录不是我们定义的,我们不用定义就可以直接拿来用,$(CURDIR)代表当前路径
21. $(@:_config=)是什么意思?
这是替换引用规则,$(VAR:A=B)表示替换变量$VAR中的A为B。Uboot中@$(MKCONFIG) $(@:_config=) arm hi3536 hi3536 NULL hi3536解析。第一个@表示静默输出,$(MKCONFIG)表示执行这个文件,后面的都是执行这个文件是的传参。 其中的一个参数 $(@:_config=) @表示先取目标名字,比如目标名字是hisi3536_config 那么把这个名字中的_config替换为空,转换 结果就是hisi3536.这个结果作为执行$(MKCONFIG)的一个传参
22. awk是什么
awk 是行处理器 在Makefile中的 awk '{print $$3}' 表示在shell中的awk '{print $3}', 功能是打印出第三个字段,字段是以空格分开的。
23 | 管道
左边的输出作为右边的输入。假如name.txt文件中的某一行是 aa bb cc ; str=$(grep 'aa' ./name.txt| awk '{print $$3}'); 那么str = cc ;先有grep找到aa这一行,把这一行作为右边的输入,那么第三个字段就是cc
24. $$ 什么意思
这个的意思就是把第一个$后面的$x交给shell环境处理。比如在Makefile中 VAR = 3;echo $.$VAR ;意思后是在shell输$VAR,但是VAR只在Makefile中有定义没有在shell中定义,所里这里echo $.$VAR输出0;还有另外一个例子Makefile中的$.$3表示shell中的$3,$3在Makefile中表示第三个输入参数
25 $(findstring s,$(MAKEFLAGS))
findstring是Makefile文本处理函数,上面这句话的意思是,$(MAKEFLAGS)这个变量中是否有 s 字符,if $(MAKEFLAGS)='ddsf',return s;else if $(MAKEFLAGS)=bb returm NULL。
$(MAKEFLAGS)是Makefile的传参,并不是所有的参数都能用这个传的, make -s 或者make -k,可以用这个传参,且对所有的下面的子Makefile 都有用
26 origin函数
$(origin O) 这个函数返回O这个变量的来源,如果在执行Makefile是 make O=xx ,说明O来自命令行,则返回"command line".
27 wildcard
匹配作用 条件假如在当前目录下有一个a.c文件, dir=./ ; $(wildcard $(dir)a.c)返回的值是./a.c ;如果dir=/ ; $(wildcard $(dir)a.c)返回的值是为NULL;因为a.c不在/目录下。
通配符展开 a=%.c 此时$(a)=%.c ; $(wildcard $(a))此时返回的是main.c
28 Makefile -D选项
-D后面表示定义了这个宏 -D后可加空格,如 gcc a.c -o haohao -D HAOHAO 表示在预编译是定义了这个宏,在源代码中, 可用 #ifdef HAOHAO 实现条件编译
20181108_Makefile知识点相关推荐
- 解释型语言与编译型的必须知识点
解释型语言与编译型的必须知识点 概念: 计算机不能理解直接理解高级语言,只能理解机器语言,所以必须把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译的方式有两种: 编译 解释 两种翻译 ...
- YOLOV4知识点分析(二)
YOLOV4知识点分析(二) 数据增强相关-mixup 论文名称:mixup: BEYOND EMPIRICAL RISK MINIMIZATION 论文地址:https://arxiv.org/ab ...
- YOLOV4知识点分析(一)
YOLOV4知识点分析(一) 简 介 yolov4论文:YOLOv4: Optimal Speed and Accuracy of Object Detection arxiv:https://arx ...
- 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里
引言 DateTime数据类型是一个复杂的问题,复杂到足以让你在编写[将日期从Web服务器返回到浏览器]简单代码时感到困惑. ASP.NET MVC 5和 Web API 2/ASP.NETCo ...
- 简练软考知识点整理-范围确认易混概念
与确认范围容易混淆的知识点包括,确认范围与核实产品.质量控制.项目收尾,下面进行比较分析. (1)确认范围与核实产品 核实产品是针对产品是否完成,在项目(或阶段)结束时由发起人或客户来验证,强调产品是 ...
- 朴素贝叶斯知识点概括
1. 简述 贝叶斯是典型的生成学习方法 对于给定的训练数据集,首先,基于特征条件独立假设,学习输入/输出的联合概率分布:然后,基于此模型,对于给定的输入x,根据贝叶斯定理求后验概率最大的输出y 术语说 ...
- 计算机二级函数知识,2017年全国计算机二级考试MS Office高级应用知识点:INDIRECT函数...
INDIRECT函数知识点 适用考试:全国计算机二级考试 考试科目:MS Office高级应用 科目知识点:INDIRECT函数 INDIRECT函数立即对引用进行计算,并显示其内容.当需要更改公式中 ...
- python如何创建一个类_python (知识点:类)简单的创建一个类
#!/usr/bin/env python # -*- coding: utf-8 -*- """ Created on Mon Nov 14 01:01:29 2016 ...
- 全国计算机二级vfp知识点,全国计算机二级VFP知识点总结
全国计算机二级 Visual FoxPro 数据库程序设计 --知识点整理资料 文件扩展名及备注文件扩展名 文件 项目 表 程序 单索引 查询 菜单定义格式 扩展名 .pjx .dbf .prg .i ...
最新文章
- python跨行字符串 变量_在Python中有没有在多行字符串中使用变量的方法?
- Python学习:元组
- 解决Tomcat下源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示
- java web 线程数_Java Web应用调优线程池
- oracle 升级前备份,rac(exadata)升级前的备份及LVM快照的恢复
- 为什么只看重结果_猫很现实?猫只是看重结果
- 组策略 之 恢复默认组策略对象命令
- node服务器中打开html文件的两种方法
- mybatis拦截器实现通用权限字段添加
- JWT介绍以及java-jwt的使用
- LeetCode 435. 无重叠区间(贪婪算法)
- VS2022安装教程和使用说明来了
- Xshell 7官网免费版下载与安装(详细教程)
- Mac搭建Airtest iOS自动化测试环境
- 中介者模式-Mediator Pattern
- XILINX DDR3 VIVADO(二)写模块
- (附源码)springboot客户信息管理系统 毕业设计 181936
- 网易云---手机验证码登录
- 美国J1签证面签需要准备哪些材料?
- http响应最大时长 nginx_请问一下该如何用nginx 设置响应时间?