生成和使用链接库:
静态库是对象文件obj的集合,静态库扩展名称.a 静态库由ar -rcs生成
静态库优点:
1,不用重新编译程序库代码,进行重新的重新链接,节省了编译过程时间
2,开发者可以提供库文件给使用的人员,不用开放源码
3,生成静态链接库,或者将一个obj文件加到已经存在的静态库
ar 库文件名称.a obj文件1 obj文件2 obj文件N+
创建静态库的最基本步骤是生成目标文件;
动态链接库
-soname,libstr.so 表示生成
动态库别名libstr.so
库名是str
库前缀是lib,后缀名称是so
-o libstr.so.1选项表示生成名字的实际动态链接库文件
-shared告诉编译器生成一个动态链接库
基于C源文件生成动态链接库的完整命令
gcc -shared -Wl,-soname,libstr.so -o libstr.so.1 C源文件需生成动态库的;
生成动态链接库很重要的问题是安装
一般情况讲生成的动态链接库复制到系统默认的动态链接库的搜索路径,通常/lib,/usr/lib,/usr/local/lib 请注意与我们的标准头文件
/etc/ld.so.cache
静态链接库,动态链接库,动态加载库
动态加载库与动态链接库不同 的是:动态链接库在程序启动的时候就要寻找动态库,找到库函数,而动态加载库可以用程序的方法来控制什么时候加载,动态加载库主要有函数dlopen(),dlerror(),dlsym()和dlclose()来控制动态库的使用;
dynamicLinker open error,close
函数dlopen()按照用户指定的方式打开动态链接库,其中参数filename为动态链接库的文件名,flag为打开方式,一般为RTLD_LASY,函数的返回值为库的指针
Funcation Prototype
void * dlopen(const char *filename,int flag);
void *phhandle = dlopen("./libStrLen.so",RTLD_LAZY);
打开动态库函数dlopen(const char *filename,int flag);
获得函数指针dlsym()
使用动态链接库的目的是调用其中的函数,完成特定的功能,函数dlsym()可以获得动态链接库中指定的函数的指针,然后可以使用这个函数指针进行操作,函数dlsym()的原型如下,其中参数handle为dlopen()打开动态库后返回的句柄,参数symbol为函数的名称,返回值为函数的指针;
/tmp/ccDDcePd.o: In function `main':
dl.c:(.text+0x48): undefined reference to `dlopen'
dl.c:(.text+0x64): undefined reference to `dlerror'
dl.c:(.text+0x9e): undefined reference to `dlsym'
dl.c:(.text+0xa7): undefined reference to `dlerror'
dl.c:(.text+0xd9): undefined reference to `pStrLenFunc'
collect2: error: ld returned 1 exit status
总结-关于C下使用静态链接库,动态库链接库,动态加载库
1,静态链接库
优点:
隐藏源码,提高最终可执行程序的编译速度
2,动态链接库
动态链接库在出现启动的时候加载库,读取库中函数...
3,动态加载库
优点,使用程序的方法控制库在何时加载
【动态加载库头文件dynamic link fcn--dlfcn.h】
动态加载库
首先使用函数dlopen()打开动态链接库,判断是否正常打开,可以使用函数dlerror()判断错误,如果上面的过程正常,使用函数dlsym()获取动态链接库的某个函数,使用这个函数完成特定功能
GCC选项
头文件Path,加载库Path,警告信息
-dmacro[defined macro]定义一个宏定义,-D选项可以选择不同的代码段,-DOS_LINUX
#ifdef OS_LINUX
Codes;
#else
Codes;
#endif
-Idir 将头文件的搜索路径扩大,包含dir目录
-Ldir将链接时使用的链接库搜索路径扩大
-static选择使用静态链接库进行链接,如果一个目录中静态库和动态库都存在
-g 调式信息
-On 优化程序,程序优化后的速度会更快,程序占用空间更小n指定优化级别
-wall == -Wl
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2014-05-22 gosslary
2014-05-22 ebtablesBridge
2014-05-22 较流行的4个开源协议
2014-05-22 Posix-linux_route
2014-05-22 linux系统资源信息监控
2014-05-22 Eucalyptus使用的技术
2014-05-22 eucalyptus的网络模式