linux动态库静态库函数覆盖

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux动态库静态库函数覆盖
本⽂讨论了linux动态库静态库中函数的覆盖问题。

测试⽬的:
同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另⼀个动态库libapi.so中,在可执⾏程序中分别连接libdync_lib.so与libapi.so,此时到底调⽤的是哪个库中的函数?
测试结论:
不同库中的同名函数会被覆盖,后链接的库中的同名函数会被先前库覆盖。

测试⽅法:
static_lib.h
1void print();
static_lib.cpp
1 #include <cstdio.h>
2 #include "static_lib.h"
3
4void print()
5 {
6 printf("i am static print\n");
7 }
dync_lib.h
1void print();
dync_lib.cpp
#include <cstdio.h>
#include "dync_lib.h"
void print()
{
printf("i am dync print\n");
}
api.h
void func();
api.cpp
1 #include "static_lib.h"
2
3void func()
4 {
5 print();
6 }
main.cpp
#include <api.h>
int main()
{
func();
print();
return0;
}
制作libdync_lib.so动态库
g++ dync_lib.cpp -shared -fPIC -o libdync_lib.so
制作libstatic_lib.a静态库
g++ -c static_lib.cpp -share -fPIC -o static_lib.o
ar crv libstatic_lib.a static_lib.o
制作libapi.so动态库,其依赖静态库libstatic_lib.a
g++ api.cpp -shared -fPIC -o libapi.so -lstatic_lib
有三种⽅式⽣成可执⾏程序
1、g++ main.cpp -lapi -o main
2、g++ main.cpp -lapi -ldync_lib -o main
3、g++ main.cpp -ldync_lib -lapi -o main
每种⽅式都能执⾏成功,但输出不⼀样,
1、2执⾏时,输出⼀致:
i am static print
3执⾏时,输出;
i am dync print
下⾯分析原因:
1、第⼀种⽅式中,main.cpp中只包含了 api.h,⽽api.h中并没有定义print函数,那么main中怎么找到了该函数并且调⽤成功了呢?
因为,⽣成libapi.so时连接了libstatic_lib.a,⽽其中包含print,也就是说,静态库中的函数符号都会被打到动态库中,所以main能找到print 函数的实现,来⾃libstatic_lib.a。

2、后2种⽅式中,只是额外链接libdync_lib.so,但链接的顺序不同。

从结果中看,程序正常执⾏。

第⼆种⽅式调⽤的是libstatic_lib.a中的print函数,对⽐发现,第三种调⽤的是libdync_lib.so中的print。

也就是说,根据链接的顺序,先被链接的库中的符号(函数)会覆盖后⾯库中的同名符号。

相关文档
最新文档