二、gcc工具链。
    

工具名
作用
Ar
生成静态库
As
汇编器
Id
链接器,在链接过程中,由gcc调用链接 器ld.将用户编译生成的目标文件连同系统的glibc启动代码链接在一起,形成最终的可执行文件
Nm
查看目标文件中的符号
Objcopy
将原目标文件中的内容复制到新的目标文件中,可以通过不同的命令选项调整目标文件的格式,例如去除ELF文件头
Ranlib
为静态库文件创建索引,相当于arw命令的s选项
Readeld
解读ELF文件头
Size
列出目标文件每一个段的大小和总的大小
Sttings
列出目标文件中的字符串
Strip
去除目标文件中的所有符号,使目标文件尺寸减小
三、Makefile的应用。
  1makefile文件入门。
     @ Makefile文件的组成内容:
        显式规则:生成的文件,生成的文件的依赖文件事生成的命令
        隐式规则:通过make工具的自动推导的功能。
        变量的定义:这些变量一般都是字符串。
        文件指示:通过用include.
        注释:#字符来进行转义。“/#
     @make工具的退出码。
         0—表示成功。
         1—表示makefile文件执行出现了错误。
         3—表示如果用户使用了make -q选项,并且make使一些目标不需要更新,则  
          返回2
 2、书写makefile规则。
      @使用基本规则。
          Targets: prerequisites
           Command    //注意这样来写的时候command前面要用tab键来开头。
        或者  targets :prerequisites ; command   //用“:”来隔开。
       @使用伪目标。
          如: clear :
                  Rm edit main.. Kd.o 
           只有通过显示地指明这个目标才能对其进行执行。为了避免和已存在的文件重
           名,可以使用一个特殊的标记。PHONY来显示地指明一个目标是伪目标。
            例如: .PHONY :clean
          这样不管你里面有没clean的文件,当你执行make clearn 都没有事。
            伪目标也可以作为默认目标。此时其位置必须是第一个目标。
            例如:  all : main.o kbd.o 
                   .PHONY all
              伪目标也可以作为依赖.(就像是子程序一样)
              例如: .PHONY: cleanall cleanobj cleanmk
                      Clearnall : cleanobj cleandiff
                       Rm app
      @使用通配符。
      “*”、“?”、“【】”
      
       @使用搜索源文件。
            设置vpath变量如:vath=src:../include  表示在当前目录上srct和父目录下的
             Include目录中。用“:”分隔。
             
             使用vpath 关键字。
              例如: vpath % .c  /src  //"%"为一个通配符。
     3、使用命令。
         @显示命令。
            例如: @echo compling........
             当make 时候就会显示命令。如 compling....
         @执行命令。
              例如:
             在编辑makefile文件中如下:
               all:
                 ls -l
                 ./hello
               .PHONY :all 
             执行makefile文件
             make -s all
             当前一个命令的结果为下一条命令使用时。用“;"隔开。如cd /home ; pwd
             命令的出错。
              当忽略命令出错造成的停止。在命令前用:和在tab后加减号"-"
                  用.IGNORE声明作为目标的。如下
                     Clear:
                       -rm -f   *.c
                 或者:clear:
                        rm -f *c
                       .IGNORE
   4、使用变量。
        @使用普通变量。
            在使用变量是要注意在变量名前加“$”,$(VARNAME),在文中使用真实在$  
            时,要这样子来用$$.如使用这个$?时要变成$$?.
        @变量中的变量。
           (1)使用“=”操作,但是很容易造成递归。
                  foo = $(bar)
                  bar =$ugh
                  Ugh = Hhdfl?
                  all :
                  echo $foo)  
                  执行make -s all
            (2)使用“:=”操作符。这个可以避免递归的危险。但是前面用到的用到
                 没有定义的变量,当为空。
             (3)使用“?=”操作符。如果变量之前没有被定义过,那么变量的值就被 
                  定义。反之,赋值语句什么也没有做。
        @追加变量的值。
              这主要是利用操作符“+=”。
         @自动化变量。

自动化变量
表示的意义
$@
表示规则中的目标文件集
$%
$<
$?
$^
$+
$*
     
5、使用条件判断.
       @条件表达式。
        表达式的格式:
       <conditional-directive>   (这可以用4个关键字)
        <text-if-true>
        endif
        或者
         <conditional-directive>   (这可以用4个关键字)
        <text-if-true>
         else
        <text-if-false>
        endif
        关键字:(ifeq,ifneq,ifdef,ifndef)  
        (1)ifeq: ifeq(arg1,arg2).比较 arg1arg2的值,相同为真。
       (2ifneq:  与上面相反。
       (3ifdef: ifdef(varible-name),如果值为不空,表达式为真。
       (4ifndef:与上面相反。
6、使用函数。
@函数调用的语法。
  必须要以$开头,以圆括号或花括号把函数名各参数括起。参数可以为变量。用豆
 例如:$bar :=$(subst  $()space ,$(comma) ,$(var))  sub为函数。
 @字符串处理函数。
   (1)字符串替换函数。
         表达式:$(subst <from>,<to>,<text>)text中的from替为to.
          如:$(result) = $(subst a, A ,how are you, china?)
             输出为: how Are you,chinA?
    (2)模式字符串替换函数。
     表达式:$(pathsubst <pattern>, <replacement>,<text>)
         函数功能:把text 中的单词有patten 改为replacement.
        (3)去空格函数。
         表达式: $strp <string>
          去掉string字符串中开头和结尾的空格。返回去空格的字符串
        (4)查找字符串函数。
         表达式:$fiindstring <find>,<in>
          功能:in the string of"in",find the string of string;
          Return :fiind the the string of  in the string of "in".
         (5)过滤函数。
             表达式:$filter <pattern....>,<text>
              $filter %.c %.h, a.c  b.c c.c d.h e f=a.c b.c c.c d.h.
         (6)反过滤函数。
            表达式:$filter-out <pattern。。。> .<text>
               功能相反。
          (7)排序函数。
                 表达式:$sort<list>
                例子:$sort hello world china)结果为: china hello world
           (8)取单词函数。
                Eg: $word  2, hello world chinathe result is : "world"
            (9)取单词串函数
               表达式:$worldlist <s>,<e>,<text>) 
               In the sring of"text",geting the string from "s" to "e"
             (10)单词个数统计
                  $worlds hello world china=3. 
             (11)首单词函数。
                  $firstword hello world china=hello 
        @文件名操作函数。
           1、取目录函数。
              $dir text.c  /home/admin/text.c
               The result is :  ./    /home/admin
           2、取文件函数
               $notdir test.c /home/admin.test.c)  the resutl : test.c test.c
           3取后缀函数。
               $suffix text.txt /home/admin/text.c filethe result is : .txt  .c
           4、取前缀
              $basename test.tex /home/admin/text.c file=/home./admin
           5、加后缀
              $addsuffix  .c  ,a b c=a,c b.c c.c
           6、加前缀
              $addprefix /home/adnin, tex.c
            7、连接函数
           $join /home/   /home/ ,text1.c text2.c test3.c=/home/text1.c /home/text2.c test3.c
            8foreach函数
            9if函数。
               $if<condition> ,<then-part> ,<else-part>
            10call函数
                add = $(1) +$(2)  #定义一个函数,求两个参数的和。
                 $call add ,1,2=3
             11origin 函数。
                 该函数可以将变量的定义信息返回给用户。
             12shell 函数
                $shell ls