当前位置:网站首页 > 技术博客 > 正文

.so文件怎么执行



参考博客:

C编译: 动态连接库 (.so文件) - Vamei - 博客园 (cnblogs.com)

C 多个动态库存在同名函数问题处理方法:-fvisibility=hidden_more_HH-CSDN博客_fvisibility

Linux编译动态链接库so避免运行时才发现函数未定义符号的错误undefined symbol的ld参数 (gmd20.github.io)

查看so库的方法__臣本布衣_新浪博客 (sina.com.cn)

Linux 动态库同名函数处理-iibull-ChinaUnix博客

https://mp.weixin..com/s/o1C-cmsz8Mh4Cm7eodqcPg

image-20230214092241111

image-20230214092303675

image-20211221100302725

(1)include中是用于生成SO的头文件,当前只有一个test.h文件,内容如下:

 

(2)src中是用于生成SO的源文件,当前只有一个test.c文件,内容如下:

 

(3)Makefile文件是用于生成SO的,内容如下:

 

生成的SO的名字为libprint_func.so

(4)main.c用于测试,函数内部会调用test.c中的函数,代码如下:

 

编译方式,直接在Makefile所在目录执行make即可。

 

执行了make之后,会在当前目录生成两个文件夹lib和obj,lib目录存放SO文件,obj目录存在生成的obj文件。

image-20211221101011250

 

接着编译main.c,生成可执行文件进行测试。

编译方式:

 

-l:说明库文件的名字,使用-lprint_func (即libprint_func库文件)

-L:指定编译库文件所在位置

-I(大写的i):指定头文件所在文件

-Wall:打印所有警告

注意:编译时必须包括SO中函数的头文件(test.h),否则会提示隐形声明的警告。

例如:在main.c中注释掉#include "test.h"。

 

编译时会提示警告:

 

直接执行可执行文件,会提示找不到libprint_func.so文件。

 

可通过gcc -print-search-dirs命令来查看库的搜索路径:

 

可以通过ldd命令查看可执行文件依赖的库:

 

可以看到找不到libprint_func.so库,有两种方法可以解决。

方法一:将libprint_func.so拷贝到系统的/lib/路径下,并执行ldconfig命令(此操作需要root权限才能搞定);

方法二:将libprint_func.so所在路径,增加到LD_LIBRARY_PATH环境变量中。

1)先使用方法二解决:

 

2)再使用方法一解决:

 

在之前test.c中的代码基础上,修改print_func函数内容:

 

然后重新生成一个SO文件,重命名为libprint_func00.so(更改Makefile)。

先删除/lib库下的libprint_func.so。

 

将libprint_func.so 和 libprint_func00.so 都放到当前目录的lib下:

 

然后使用方法二链接SO文件:

 

编译:

 

执行:

 

可以看出,执行时调用的是libprint_func.so库

下面更改编译时SO文件的顺序(先-lprint_func00),然后执行:

 

可以看出,执行时调用的是libprint_func00.so库

总结:SO中重名时,优先调用的是先链接的库。

对于不同库中函数重名的问题,可参考博客Linux 动态库同名函数处理-iibull-ChinaUnix博客,这里不进行说明。

参考:https://mp.weixin..com/s/o1C-cmsz8Mh4Cm7eodqcPg

注意:高版本的GCC,默认会去掉不使用的SO,像完成这个实验,需要加上-Wl,--no-as-needed选项。

首先编译一个libprint.so:

 

然后,编译一个可执行程序,需要链接libprint.so:

 

接着链接一个不需要使用的SO:

 

可使用命令查看不需要链接的SO:

 

解决方式:使用编译选项:

 
 

在运行链接了动态库的时候需要去找到SO,一般使用方法是修改LD_LIBRARY_PATH这个环境变量。LD_LIBRARY_PATH则既属于链接期搜索路径,又属于运行时期的搜索路径。

链接选项,它是指定运行时候都使用的搜索路径。通过这个选项,可以将运行库的路径硬编码到可执行文件内部。

 

当然,这种方式也有使用限制,比如将库从指定路径移除后,则运行时会报错,没有使用LD_LIBRARY_PATH指定库的路径灵活:

 

由于这是第一次尝试生成SO文件,部分地方可能存在问题,希望网友指出。

再次感谢参考的博客:

C编译: 动态连接库 (.so文件) - Vamei - 博客园 (cnblogs.com)

C 多个动态库存在同名函数问题处理方法:-fvisibility=hidden_more_HH-CSDN博客_fvisibility

Linux编译动态链接库so避免运行时才发现函数未定义符号的错误undefined symbol的ld参数 (gmd20.github.io)

查看so库的方法__臣本布衣_新浪博客 (sina.com.cn)

Linux 动态库同名函数处理-iibull-ChinaUnix博客

Linux下部分用于SO相关的命令:

打印SO中的符号信息:nm -D libxxx.so

 

查看依赖关系:ldd libxxx.so

 

查看so库的属性:file libxxx.so


                            

  • 上一篇: jstorm ui
  • 下一篇: uvm实战 pdf
  • 版权声明


    相关文章:

  • jstorm ui2025-04-16 16:01:03
  • opengl基础教程2025-04-16 16:01:03
  • 多层感知器和bp算法2025-04-16 16:01:03
  • 黑客代码下载2025-04-16 16:01:03
  • autoit3 教程2025-04-16 16:01:03
  • uvm实战 pdf2025-04-16 16:01:03
  • python可视化报告2025-04-16 16:01:03
  • 什么是倒排索引技术2025-04-16 16:01:03
  • 单臂旁路由设置教程2025-04-16 16:01:03
  • idea maven换源2025-04-16 16:01:03