目录文件操作函数 库(静态库动态库)

18 篇文章 0 订阅

【1】目录文件操作函数

  • opendirclosedirreaddir

    1. DIR *opendir(const char *name);
      功能:打开目录
      参数:
      name:目录名
      返回值:成功:目录流指针
      失败:NULL 更新errno

    2. int closedir(DIR *dirp);
      功能:关闭目录
      参数:
      dirp:目录流指针
      返回值:成功:0
      失败:-1 更新errno

    3. struct dirent *readdir(DIR *dirp);
      功能:读目录文件
      参数:
      dirp:目录流指针
      返回值:成功返回的保存文件信息的结构体地址
      失败或读到目录文件结尾:NULL 更新errno

   
  struct dirent {
     ino_t          d_ino;       /* 文件inode */
     off_t          d_off;       /* 下一个文件的偏移指针 */
     unsigned short d_reclen;    /* length of this record */
     unsigned char  d_type;      /* type of file; not supported
                                    by all file system types */
     char           d_name[256]; /* 文件名 */
 };

【2】库


  1. 库是一种可执行代码的二进制形式。
    通俗讲就是把一些常用函数的目标文件打包在一起,提供相应
    函数的接口,便于程序员使用;它可以被操作系统载入内存执行。
    由于windows和linux的本质不同,因此二者库的二进制是不兼容的
    分为:动态库和静态库
    1)静态库:静态库在程序编译时会被连接到目标代码中,
    程序运行时将不再需要该静态库,因此可执行文件体积较大。
    2)动态库在程序编译时并不会被连接到目标代码中,
    而是在程序运行时才被载入,因此在程序运行时还需要动态库
    存在,因此代码体积较小

    动态库 静态库
    linux:.so .a
    windows:.dll .lib

  2. 静态库
    创建静态库步骤:

    1. 将源文件编译生成目标文件
      gcc -c add.c -o add.o

    2. 创建静态库用ar命令,它将很多.o转换成.a
      ar crs libmyadd.a add.o

      libmyadd.alib指库,myadd是库名,.a指静态库

    3. 静态库文件名的命名规范是以lib为前缀,紧接着跟
      静态库名,扩展名为.a。使用静态链接库
      gcc main.c -L. -lmyadd -o main
      -L:指定链接路径
      -l:链接库
      执行./main

    4. 优缺点:
      优点: 程序中已包含代码,运行时不再需要静态库。
      运行时无需加载库,运行速度更快。
      缺点: 静态库中的代码复制到了程序中,使程序会占更多的磁盘和内存空间
      静态库升级后,程序需要重新编译链接

  3. 动态库(共享库)
    创建动态库步骤:

    1. -我们用gcc来创建共享库
      gcc -fPIC -c add.c -o add.o
      -fPIC 创建与地址无关的编译程序
      gcc -shared -o libmyadd.so add.o

    2. -编译代码
      gcc main.c -L. -lmyadd -o main
      ldd main 查看main的运行依赖那些库。

    3. -为了让执行程序顺利找到动态库,有三种方法 :

      1. 把库拷贝到/usr/lib和/lib目录下。
        sudo mv libmyadd.so /usr/lib

      2. 在LD_LIBRARY_PATH环境变量中加上库所在路径。
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.(最好是绝对路径,要在一行)
        (终端关闭,环境变量就没在了)
        本次配置只在当前终端有效,关闭和关机后就没效了。
        想要永久有效需要到 .bashrc文件中进行修改。

        生效文件:source .bashrc

      3. 添加/etc/ld.so.conf.d/*.conf文件,
        把库所在的路径加到文件末尾,并执行ldconfig刷新
        sudo vi xx.conf
        添加动态库存在的路径,如:
        /home/linux/DC20111/IO/day3/share
        /etc/ld.so.conf.d
        执行:sudo ldconfig生效

    4. 优缺点:
      优点: 程序在执行时加载动态库,代码体积小
      将一些程序升级变得简单。
      不同的应用程序如果调用相同的库,那么在内存
      里只需要有一份该共享库的实例。
      缺点:运行时还需要动态库的存在,移植性较差

    注意:更新静态库,所有的可执行文件需要重新编译
    更新动态库,所有的可执行文件不需要重新进行编译,直接执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值