20181108_Makefile知识点

1. = :=  +=  ?= 得不同用法
         =  作用全部makefile文件
        :=  有时间元素
        +=
        ?=  如果没有赋值过,就赋值后面的值


2. @的用法
        @放在行首,表示不打印此行。默认在编译的过程中,会把此行的展开效果字符串打印出来。
        @ echo hello   在命令行执行make 只打印出一行hello.如果不加@,会打印出 echo hello ,然后再打印hello  


3. MAKEmake的关系
        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)=./

 
     

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

猜你喜欢

转载自blog.csdn.net/qq_37718322/article/details/83855654