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=./ 的作用
程序运行时默认到环境变量LD_LIBRARY_PATH目录下去找动态库,如果动态库的目录没有添加到LD_LIBRARY_PATH中则需要用-rpath 指定
-rpath和-L不同 -L是为链接的时候指定动态库 -rpath是为程序运行指定动态库
-Wl选项告诉编译器将后面的参数传递给链接器。
7. sed
sed 是编辑工具和vim差不多,只是VIM我们人在命令行输入,sed可以用脚本蝎
sed -i 's/aa/nnn/g' ./a.txt s表示替换指令 ;aa是要被替换成nnn的 ;g表示的字符都要替换,如果没有g 一行中有多个aa的话只会替换第一个 ; -i 直接修改读取的文件内容,而不是输出到终端
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,[email protected] 其中-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)=./