动态链接库学习札记
动态链接库是相对于静态链接库的一种说法,很多时候也叫做共享链接库,就连gcc编译动态链接库的选项也叫shared。之所以称之为共享链接库,是因为很多时候其都用于多个进程共享某个动态链接库。比如A进程调用了a.so里面的test()函数,而B进程也调用了a.so里面的set()函数,此时在内存中,就只需保留一个a.so文件,由调用了它里面函数的进程共享。
调用动态链接库的程序,只有在执行的时候,才会去查找动态链接库里面所调用的函数,这样就减小了可执行文件的大小。而且当升级或者优化了动态链接库里的函数的后,只要不改变该函数的调用方式和该函数的返回值,调用该动态链接库的函数就可以不做任何修改。
下面是我做的动态链接库的练习:
本程序有一个动态链接库,libprint_hello.so,里面有一个函数int print_hello();main.c中调用了此函数。
vim print_hello.c
vim main.c
将print_hello.c编译成动态链接库:
gcc -c print_hello.c
gcc -fpic -shared print_hello.o -o libprint_hello.so
编译可执行文件
gcc main.c -o main -L. -lprint_hello
此时执行./main发现报错“cannot open shared object file: No such file or directory”
这是因为程序在默认的路径下搜索lib文件的时候,发现找不到所需的libprint_hello.so动态库文件,最简单的办法就是把libprint_hello.so移动到/lib文件里面去,但是由于我这只是个测试文件,所以我采用另外一种方法。通过修改动态链接库的搜索路径变量,将我编写的动态链接库文件的目录加入到动态链接库搜索路径变量中就库了。
export LD_LIBRARY_PATH=/home/daveyhuang/gcc/so:$LD_LIBRARY_PATH
再执行./main函数:
这样,就达到了预期的效果。
编译其的Makefile如下。
vim Makefile:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架