C 高级编程4 makefile 与 IO

make 与 makefile
1.目标的语法
    目标名:依赖目标
      @命令
      @命令
    make的命令行使用
    make -f make 脚本文件 目标名
    
2.目标的划分
demo.mk
demo:
    gcc -c -fpic input.c
    gcc -c -fpic primer.c
    gcc -shared -olibdemo.so input.o primer.o
    gcc demo.c -ldemo -L. -omain
    
转变为   
    
demo1.mk:    
compile:
    gcc -c -fpic input.c
    gcc -c -fpic primer.c
link:complie
    gcc -shared -olibdemo.so input.o primer.o
demo:link 
    gcc demo.c -ldemo -L. -omain
    
<compile link 是不存在的文件,不存在就是最新的>

make -f demo1.mk compile
make -f demo1.mk link
make -f demo1.mk demo  

3.默认目标
   a.不指定目标,执行第一个目标
    make -f demo1.mk
    等介于make -f demo1.mk compile
    
   b.不指定make 文件,默认文件是makefile ,Makefile, makefile优先加载
     make
     
     
  目标的调用规则
      make执行目标:(make把 目标 当作文件)
        搜索与目标相同的文件
        如果文件存在,则判定日期.
        日期最新,则停止执行,输出提示
        日期不是最新,则进行执行.
        没有依赖就是最新的目标文件,不编绎
     
        比较:当前目标与依赖目标
        
demo2.mk:   
//跟据编译结果文件依赖,make就可以对实际存在的文件时间比较,决定编译进程
input.o:input.c:
    gcc -c -fpic input.c
primer.o:primer.c
    gcc -c -fpic primer.c
libdemo.so:input.o primer.o
    gcc -shared -olibdemo.so input.o primer.o
demo:demo.c libdemo.so
    gcc demo.c -ldemo -L. -odemo
clean:
    rm -rf *o demo *.so *a 
    
    
    
5.建义:
   只要有文件输出,就把任务作为一个目标,并把输出的文件作为目标名

6.潜规则(不建议)
   注释符号 #
   .C目标与.O目标
   查找.O目标,目标不存在,就把.O替换成.C
   如果.C存在,实施潜规则:直接调用GCC 把.C执行为.O
   
   
demo3.mk:   
//跟据编译结果文件依赖,make就可以对实际存在的文件时间比较,决定编译进程
#input.o:input.c:
#    gcc -c -fpic input.c
#primer.o:primer.c
#    gcc -c -fpic primer.c
libdemo.so:input.o primer.o
    gcc -shared -olibdemo.so input.o primer.o
demo:demo.c libdemo.so
    gcc demo.c -ldemo -L. -odemo
clean:
    rm -rf *o demo *.so *a 
   
7.定义变量

变量名=值1 值2
$(变量名) ${变量名}
  
demo4.mk:   
OBJ=input.o primer.o
input.o:input.c:
    gcc -c -fpic input.c
primer.o:primer.c
    gcc -c -fpic primer.c
libdemo.so:$(OBJ)
    gcc -shared -olibdemo.so input.o primer.o
demo:demo.c libdemo.so
    gcc demo.c -ldemo -L. -odemo
.PHONY:clean
clean:
    rm -rf *o demo *.so *a 
    echo ${PATH}  //环境变量
    echo $(PATH) 


8.伪目标
     不把目标当成文件处理的
     声明伪目标
     .PHONY:clean


没有讲的:
   1.make的配制
   2.make变量的操作函数
   3.多make文件使用
   
二.环境变量
 
 env.c

int main(int args,char *argv,char **arge)
 {
   while(*arge)
   {
       printf("%s
",*arge);
       arge++;
       
   }    
     
 }
 
 
 arge** ---->char*------>内容
             char*
              0
makefile

env:env.c
    gcc env.c -omain
clean:
    rm -rf main *.o
    
 命令行参数 argv与环境行arge都是字符串数组
 约定:最后一个字符串是NULL/0
 
2.在C的标准库提代了一个外部变量
#include <stdio>    
#include <unistd.h>
void main(){
    extern char **environ  
    while(*environ)
    {
        printf("%s
,*environ")
        *environ++
    } 
}
 make env
 ----------------------------------------------
 3.取环境变量的值
   getenv
   setenv
   unsetenv
   
   #include <unistd.h>
   #include <stdlib.h>
   #include <stdio.h>
   main()
   {
       char *val=getenv("PATH");
       printf("%s",val);
   }
 
 三.IO的认识
     1.认识内核对象
          不允许访问内核算设备和内存
          但可以通过内核系统函数去访问
          对每个内核对象进行编号ID.
          如果访问内核算对象,只能通过ID
          
          编程模型:
            申请得到一个ID
            在内核系统函数中使用ID得到对应内核对象
          
     2.如何访问文件:
          使用函数,传递一个文件,系统打开文件,加载文件返加一个ID
          使用函数,传递ID,得到数据
          使用函数传ID,告诉系统释放文件
          
          ID:文件描述符号.(fd)
          每个程序执行的时候都有一个目录,存放打开的文件的描述符
          
          #include <stdio.h>
          #include <stdlib.h>
          main()
          {
              printf("%p",getpid());
              while(1);
              
          }
          
          cd /proc/25857/fd
          ls
          
    ::每个程序可打开三个设备(012)
          0:标准输入
          1:标准输出
          2:错误输出
          
   4.操作文件描述符号
       sszie_t write(int fd, void * buf,size_t size);
       返回:
          >0 实际写入的数据
          -1 写入错误
       ssize_t read(int fd, void *buf ,size_t size);
       返回:
         >0:实际读取的数据
         =0:碰到文件结束符号EOF ctrl+d
         -1:读取错误
         
         
      #include <stdio.h>
      #include <stdlib.h>
          main()
          {
              
              while(0"HELLO
",6);
              while(1"world
",6);
              while(2,"louis
",6);
          }       
         
       建议:
           0:输入 
           1:输出 
           2:错误
           
        
     #include <stdio.h>
     #include <stdlib.h>
          main()
          {
              
              while(0"HELLO
",6);
              while(1"world
",6);
              while(2,"louis
",6);
              int a=20;
              write(1,&a,4);
          }         
       乱码:
       
    #include <stdio.h>
    #include <stdlib.h>
          main()
          {
              char buf[30];
              int r=read(0,buf,30);
              printf("youput:%d
",r);
              if(r>0)
              {
              buf[r]=0;
              printf("::%s
",buf);
              }
              if(r==0)
              {
                  
                  printf("ctrl+d
");
              }
              if(r==-1)
              {
                  
                  printf("error
");
              }
              
              
              
          }         
  
           
          
          
          
           
 
  



 
 
 
原文地址:https://www.cnblogs.com/zengkefu/p/5523789.html