LINUX下动态库的使用方式

本文详细介绍了Linux下动态库的编译和使用,包括编译链接和dlopen方式。通过实例展示了动态库加载过程,讨论了动态库与静态库共存时的优先级,并提供了验证方法。同时,文章提供了相关资源链接以供深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包括三个部分:

 1. 动态库编译

 2. 动态库使用方式:编译链接

 3. 动态库使用方式: dlopen

今天面试有人说你连基本的动态库加载都不清楚?!错要承认挨打站稳;

如下:

---------文件列表-----------

hello.c  ---- hello()函数 输出字符串

hello.h  --- 包含一个头文件

main.c  ---编译方式使用动态库的文件

dlmain.c ---dlopen方式使用动态库的文件


----hello.h---

#ifndef _HELLO_H_
#define _HELLO_H_
void hello(const char* name);
#endif


----hello.c---

#include "hello.h"
int main()
{
 hello("everyone");
 return 0;
}

---mian.c---

#include "hello.h"
int main()
{
 hello("everyone");
 return 0;
}


---dlmain.c---

#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
int main()
{
   void *handle = NULL;
   void (*hello)(const char* str);
   handle = dlopen("./libmyhello.so", RTLD_LAZY);
   if(handle==NULL)
   {
       printf("dll loading error.\n");
       return 0;
   }    
   hello = (void(*)(const char*))dlsym(handle,"hello");
   if(dlerror()!=NULL)
   {
     printf("fun load error.\n");
     return 0;
   }

  
   hello("dlopen ");   

   dlclose(handle ); 
}


实验:如果先dlclose 再调用so库中查找到的函数,会发生什么事儿?

PS:-> 符号表示输出,不是命令。

----------前序,静态库的方式-----------

1.//先生成 中间 .o文件 

#gcc hello.c ->hell.o

2. //打包静态库 ar功能请再查询

#ar cr libmyhello.a hello.o-> libmyhello.a

3. // 使用静态库生成目标文件

#gcc -o hello main.c -L . -lmyhello -> hello 

4.//执行

 #./hello  -> hello everyone! 

5.//删除静态库,再执行还是正确,说明hello目标文件中已经包含了 libmyhello.o内容;  

#rm libmyhello.o

#./hello   -> hello everyone! 


---------动态库使用,编译链接方式------------

1.生成so文件

#gcc -shared -fPCI -o libmyhello.so hello.o   ->libmyhello.so

2. 编译目标文件

gcc -o hello main.c -L . -lmyhello  ->hello
3.执行目标文件     

#./hello   会报错:while loading shared libraries:libmyhello.so:can not open  shared object:No shuch file or directory
4. 拷贝so到用户库

#cp libmyhello.so /usr/lib           拷贝自己的so库到 /usr/lib 下,也可以用修改环境变量等方式,请自行扩展

#./hello  -> hello everyone!          这次正确了



---------动态库使用,dlopen方式------------

1.  生成动态库.

#gcc -ldl dlmain.c -o dlmain   ->dlmain

2. 执行 

#./dlmain  ->hello everyone!



PS:

Q1)动态库和静态库都存在的情况,都用gcc -o hello main.c -L . -lmyhello 这样的命令生成,动态库和静态库都存在的时候,有没有冲突?怎么知道是.so库还是.a库呢?

Q1)验证方式:可以将动态库和静态库都编译好,执行的前把动态库删掉,如果报错是否证明使用的是动态库,反之是静态库;

验证结果:当动态库和静态库都存在的情况下,优先使用so动态库;


清理动作没有赘述,实验中,尽量将对比前后的动态库进行恢复,比如做后面dlopen方法的实验, usr/lib下的 libmyhello.so先删掉,看看会发生什么。到底用到了什么。


参考博文:

http://www.cnblogs.com/leaven/archive/2010/06/11/1756294.html【Linux动态库的编译与使用 转载】
http://www.cnblogs.com/softfair/archive/2008/09/17/l-dynamic-libraries.html【Linux 动态库剖析】
http://blog.youkuaiyun.com/chaieven/article/details/20796421【linux下的静态库和动态库的编译和应用】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值