参考博客:
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



(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文件。

接着编译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
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11116.html