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 实现条件编译