目录函数及静态库、动态库的制作使用

一.目录相关的函数

1.  opendir(const char *name):

功能:打开一个目录

参数:  name:目录名

返回值:成功返回DIR结构体指针,失败返回NULL置位错误码

2.closedir(DIR *dirp):

功能:关闭目录

参数:  dirp:目录的指针

返回值:成功返回0,失败返回-1置位错误码

3.readdirr(DIR *dirp):

功能:读取一个目录下的内容

参数:  dirp:opendir时候返回的指针

返回值:成功返回dirent结构体指针,失败返回NULL,置位错误码

例:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

int main(int argc, char const *argv[])
{
    //1.判断输入用户的参数的个数
    if(argc!=3){
        fprintf(stderr,"intput error,try again\n");
        fprintf(stderr,"usage: ./a.out filename dirname\n");
        return -1;
    }
    //2.打开一个目录
    DIR *dir;
    struct dirent *dt;//为了打印文件的相关内容
    struct stat st;
    int flags=0;
    if((dir=opendir(argv[1]))==NULL){
        perror("open dir error");
        return -1;
    }
    //3.读取目录下的内容
    //readdir成功返回dirent结构体指针
    while((dt=readdir(dir))!= NULL){
        if(strcmp(dt->d_name,argv[1])==0){
            flags=1;
            if(stat(dt->d_name,&st)){
                perror("stat error");
                return -1;
            }
            printf("filename=%s,type=%#o,ino=%ld,mode=%#o\n",dt->d_name,dt->d_type,dt->d_ino,st.st_mode&0777);
        }
        //判断是什么类型的文件
        switch(dt->d_type){
            case DT_BLK:
                printf("这是一个块设备文件\n");
                break;
            case DT_CHR:
                printf("这是一个字符设备文件\n");
                break;
            case DT_FIFO:
                printf("这是一个管道文件\n");
                break;
            case DT_LNK:
                printf("这是一个链接文件\n");
                break;
            case DT_SOCK:
                printf("这是一个套接字文件\n");
                break;
            case DT_REG:
                printf("这是一个普通文件\n");
                break;
            case DT_DIR:
                printf("这是一个目录文件\n");
                break;
        }
    }
    if(flags==0){
            printf("不存在这个文件\n");
    }
    //4.关闭目录
    closedir(dir);
    return 0;
}

二.系统中库的制作

编译的.c文件中不能含有main函数

windows中库的格式

xxx.dll: 动态库

xxx.lib: 静态库

Linux的库格式

libxxx.so: 动态库

libxxx.a: 静态库

1.静态库的制作

xxx表示你想封装的.c文件,里边不能包含main函数

编译:gcc -c xxx.c -o xxx.o  (只编译不链接)

ar -cr libxxx.a xxx.o   (创建一个库文件,-r 将文件中的函数放入到库中)

2.静态库的使用

-L:指定库的路径

-l:指定链接的库的名字

-I:指定头文件的路径

编译:gcc main.c -L . -lxxx -o test -I . //生成test的可执行文件

3.动态库的制作

编译:gcc -fPIC -shared xxx.c -o xxx.so  生成动态库

4.动态库的使用

-L:指定库的路径

-l:指定链接的库的名字

-I:指定头文件的路径

编译:gcc main.c -L . -lxxx  -I .  -o test//生成test的可执行文件

这里需要注意的是直接编译会报错,因为会找不到库的路径需要通过以下方式之一进行修改

方式一:

export LD_LIBRARY_PATH=.

//告诉系统这个库的路径在当前位置export LD_LIBRARY_PATH记录的环境变量,这种方式只对当前终端生效

方式二:

sudo cp libxxx.so /lib将动态库拷到系统的库的路径下,永久生效

//将动态库拷贝到系统的路径下

方式三:

将动态库的路径放到下边这个文件里边

sudo vi /etc/ld.so.conf.d/libc.conf      //修改系统的配置文件

sudo ldconfig   //让配置立即生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值