C库的使用——静态库、动态库

C库的使用——静态库、动态库


  • 静态库(调用时与程序整合)

创建或操作静态库——ar

ar [drqtpmmx] [options] archivefile objfile……ar参数archivefile“*.o”

参数及其意义

-r objfile文件插入静态库尾或替换静态库中同名文件

-x 从静态库文件中抽取文件object

-t 打印静态库的成员文件列表

-d 从静态库中删除文件objfile

-s 重置静态库文件索引

-v 创建文件冗余信息

-c 创建静态库文件

 eg:

ar -rsv libpr.a pr1.o pr2.o //静态库命令规则:lib[name].a

cc -o main mian.c -L./ -lprcc -o main main.c ./libpr.a //-L提供静态库目录。

 

  • 动态库(程序执行时才会调用

Linux和其他使用gcc编译器的Unix设计库命令:

gcc -fpic -c d1.c d2.c //生成*.o文件

gcc -shared -o d1.so d1.o

gcc -shared -o d2.so d2.o

gcc -fpic -shared -o d1.so d1.c

gcc -fpic -shared -o d2.so d2.c //某些gcc上可用-G替换-shared

隐式调用:cc -o main mian.c -L./ d1.so //-L 提供动态库目录。

调用后使用与静态库类似。

显式调用:cc -o main main.c -ldl //gcc编译器

#include <dlfcn.h>

Void *dlopen (const char *pathname, int mode); //返回动态库的句柄。

Mode:RTLD_LAZY/动态库的对象符号在被调用时解析;RTLD_NOW/动态库对象的所有符号在函数dlopen返回前被解析。

Void *dlsym(void *handle, const char *name);//在库中搜索函数/变量的名称。

Char *dlerror(void); //获取错误信息,无错返回NULL2次调用,后一次返回NULL

Int dlclose(void *handle);//动态库使用完必须关闭。

使用时需定义变量。  void*pHandle;//动态库句柄。Void (*pFunc)();//指向函数的指针。Int *p;//变量地址。

 

总结:

加载静态库就是将库目前的所有内容链接到编译文件中。(编译时即完成)。隐式加载动态库就是编译时将动态库路径、库名加载到代码中,执行时再加载所有库的内容到内存中。显示调用编译时与隐式类似,但是是通过文件代码调用的,通过直接搜索找到并加载相关信息。

动态库的执行时加载的特性赋予了库极大的灵活性,可以实现升级库而不用重新编译代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值