zoukankan      html  css  js  c++  java
  • 为类型定义取别名、环境变量、静态库与动态库(day03)

    一、为类型命名别名
    struct node{
        int num;
        struct node *next;
    };
    typedef struct node node_t;
    node_t n;
    
    使用typedef为类型定义别名。
    三个步骤:
    1、定义一个类型的变量或常量
    2、在第一步的基础上,在最前边加上typedef关键字,这时候,原来的变量或常量就是类型的别名(新类型)。
    3、使用新类型定义变量或常量。
    
    举例说明:
    1、为int类型定义别名,count_t;
    typedef int  count_t;
    count_t c;
    2、在系统中经常会出现下边情况
    uint32_t;
    typedef unsigned long uint32_t;
    typedef unsigned short uint16_t;
    3、为指针类型定义别名
    char *str_t;
    变量  str_t    类型  *
    typedef char *str_t;
    str_t s,r;=====char *s,*r;
    4、为一个结构体类型定义别名
    struct node{
        int num;
        struct node *next;
    };
    typedef struct node node_t;
    typedef node_t *list_t;
    list_t h;
    list_t *n;
    
    5、为函数类型定义别名
    int (*fun_t)(int,int);
    fun_t 是变量
    typedef int (*fun_t)(int,int);
    fun_t   是类型的别名   指针类型  访问方式是int(int,int);
    
    typedef int t_add(int,int);
    t_add  类型的别名 int (int,int);  
    t_add *f;
    以昨天代码为例,演示类型的别名
    
    6、为数组类型命名别名
    int arr_t[3];
    arr_t是常量
    int [3]  类型
    typedef int arr_t[3];
    arr_t是类型的别名  int [3] 
    arr_t a;  a是什么?  a是一个一维数组。
    arr_t b[2]; 
    验证数组的别名。代码参见 arr_alias.c
    
    回调函数
    
    二、环境变量
    什么是环境变量?
    操作系统为系统上运行的程序需要提供一个环境,在这个环境中有些资源的访问需要使用变量的形式提供,这就是环境变量。
    
    bash交互窗口的环境变量。
    程序和进程的区别?
    程序是指令的集合。静态的。
    进程是程序运行的实例。程序加载到内存运行起来,才是进程。
    一个程序运行一次产生一个进程。每个进程都有自己的一个身份证号。这个编号专业术语称为PID。
    环境变量是可以被子进程继承的变量。?
    如何察看bash下的环境变量?
    env   
    环境变量的格式:
    name=value
    切记等号的左右两边不允许出现空格
    
    USER=tarena
    如何访问环境变量的值?
    $USER
    
    echo $USER
    bash下有两种变量   自定义类型的变量   环境变量
    自定义类型的变量不能被子进程继承?
    而环境变量是可以被子进程继承的。?
    如何为自定义变量赋初值?
    NAME=beijing  自定义变量也就是当前bash私有的变量。
    将自定义变量转换为环境变量
    export 变量的名字
    
    PATH   PS1
    
    PS1    这个环境变量是提示符资源的环境变量。
    通过设置PS1环境变量就可以改变bash的提示符
    export PS1="W$"
    
    《鸟哥私房菜》
    在bash启动的时候,会首先执行一个脚本程序。这个脚本程序中可以配置bash的环境变量。
    文件的名字是~/.bashrc
    
    在文件的末尾增加一行,内容是:
    export PS1="W$"
    
    PATH:
    察看PATH的内容:
    UC$echo $PATH
    /home/tarena/workdir/Android2.3/android-source/jdk1.6.0_16/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/home/tarena/workdir/linux-x86/sdk/android-sdk_eng.root_linux-x86/tools
    
    以冒号作为分隔符,有多条路径。
    export PATH=$PATH:.
    
    三、静态库文件的制作和使用
    静态库文件的命名    lib库名.a
    函数库分为两种。静态库和动态库
    静态库的制作和使用步骤(tmath文件夹)
    1、需要将添加到静态库的文件编译为目标文件
    tmath$ls
    add.c  mul.c  process.c  t_math.h
    tmath$gcc -c *.c
    tmath$ls
    add.c  mul.c  process.c  t_math.h
    add.o  mul.o  process.o
    2、将第一步生成的目标文件打包到静态库文件中
    tmath$ar -r libpmath.a *.o
    ar: creating libpmath.a
    tmath$ls 
    add.c  libpmath.a  mul.o      process.o
    add.o  mul.c       process.c  t_math.h
    3、使用静态库文件链接源文件生成可执行文件
    gcc point.o -Ltmath -lpmath -o p
    
    补充:
    gcc的参数
    -I路径  将路径添加到系统的指定的路径中。(搜索头文件的指定路径中)
    
    -L路径   这个路径是库文件所在的路径
    -l库名   
    
    
    四、动态库的制作和使用
    动态库文件的命名   lib库名.so
    
    动态库的制作和使用步骤:
    1、将需要加入到动态库的文件编译成目标文件。(与位置无关的目标文件)
    tmath$gcc -c -fPIC *.c
    tmath$ls
    add.c  mul.c  process.c  t_math.h
    add.o  mul.o  process.o
    
    2、将生成的目标文件打包到动态库文件中
    tmath$gcc -shared -o libpmath.so *.o
    tmath$ls
    add.c  libpmath.so  mul.o      process.o
    add.o  mul.c        process.c  t_math.h
    
    3、将源程序链接动态库文件,生成可执行文件。
    day03$gcc point.c -Ltmath -lpmath -Itmath
    
    day03$a.out 
    a.out: error while loading shared libraries: libpmath.so: cannot open shared object file: No such file or directory
    
    链接的时候  加载的时候
    连接器        加载器
    问题的原因是加载器找不到libpmath.so文件
    a.out 程序依赖于动态库libpmath.so
    如何察看你的可执行文件依赖哪些动态库?
    ldd  可执行文件的名字
    
    需要加载器找到这个库文件。
    1、使用环境变量告诉加载器动态库的搜索路径
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:tmath
    
    2、加载器和链接器都有默认路径。/lib或者/usr/lib
    
    动态库和静态库的区别
    使用静态库生成的可执行文件,静态链接的。可执行文件不再依赖于静态库。
    使用动态库生成的可执行文件,动态链接的。可执行文件依赖于动态库。
    
    动态链接是发生在程序加载到内存中的时候发生链接。
    动态库也称为共享库。
    
    可执行文件和动态库文件有效的隔离。
    总结:
    一、为类型定义别名
    二、环境变量
    三、静态库的制作和使用
    四、动态库的制作和使用
  • 相关阅读:
    hbase二级索引学习
    redis-cluster集群Mac部署
    http-flume-kafka.conf
    linux 替换文件中的字符串
    flumeDemo
    redis_exporter监控安装
    Hbase内存磁盘大致关系
    spring cloud 尚硅谷学习
    C10K问题
    navicat 远程链接Mysql问题
  • 原文地址:https://www.cnblogs.com/Kernel001/p/7732531.html
Copyright © 2011-2022 走看看