linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题。
测试目的:
同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另一个动态库libapi.so中,
在可执行程序中分别连接libdync_lib.so与libapi.so,此时到底调用的是哪个库中的函数?
测试结论:
不同库中的同名函数会被覆盖,后链接的库中的同名函数会被先前库覆盖。
测试方法:
static_lib.h
void print();
static_lib.cpp
#include <cstdio.h>
#include "static_lib.h" void print()
{
printf("i am static print\n");
}
dync_lib.h
void 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
#include "static_lib.h" void func()
{
print();
}
main.cpp
#include <api.h> int main()
{
func();
print();
return ;
}
制作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。
也就是说,根据链接的顺序,先被链接的库中的符号(函数)会覆盖后面库中的同名符号。
linux 动态库 静态库 函数覆盖的更多相关文章
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
- Linux库函数制作(静态库、动态库)
Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依 ...
- 在Linux中创建静态库.a和动态库.so
转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- linux+vs2013编译静态库和动态库
Linux下创建与使用静态库 Linux静态库命名规则 Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为 ...
- Linux 动态库 静态库
什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...
- linux下的静态库和动态库
一.linux下的静态库 静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在! 二.linux下动态库的构建和使用 1.动态库的构建 ...
- Linux中的静态库与动态库
什么是库文件? 库文件是事先编译好的方法的合集.比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,不需要重新编写. Linux系统中: 1.静态库的扩展名为.a:2. ...
- linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库
linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库 创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查 ...
随机推荐
- python3中reduce()函数的使用方法示例
reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学 ...
- IDEA设置syso快捷键输出System.out.println();
用Eclipse时间长了, 就习惯之前的快捷键! 当然, IDEA不愧是Java开发的”利器”! 写起代码就是一个字 – “爽”! 建议大家可以去尝试一下! 当然, 在IDEA中输出System.ou ...
- SpringMvc Intercetor
对于登录的访问控制以及session的超时控制. 当用户在未登录情况下,直接在地址栏输入url进入某些页面时,会越过登录页,如果不做控制会有安全问题. 因此可添加拦截器处理异常: /** * @Des ...
- 使用webstorm创建vue项目
进行vue开发首先需要配置node环境 配置好node环境在命令行中输入node -v npm -v则表示环境配置成功 在webstorm命令行中输入命令 1.安装脚手架 npm install -g ...
- LESS CSS 实例
值得参考的 10 个 LESS CSS 实例 2 收藏(185) LESS, Sass 和其他 CSS 预处理器是一种超棒的方法用来扩展 CSS 功能,使之更适合程序员.你可以使用变量.函数.混合 ...
- 使用Jena执行SPARQL的Select和Ask查询
使用Jena执行SPARQL的Select和ask查询 提供基本的接口和实现类,可在其他代码中直接调用 Select查询 接口 /** * The interface Select dao. * 本体 ...
- Kotlin语言学习笔记(6)
运算符重载(Operator overloading) 一元运算符 Expression Translated to +a a.unaryPlus() -a a.unaryMinus() !a a.n ...
- delphi实现两个目录路径的链接
filepath := PathJoin(['C:', 'path1', 'path2\', 'a.doc']); // filepath = 'C:\path1\path2\a.doc' 代码: f ...
- scala-学习 2
列表操作 List() 或者是 Nil 空list scala> val a = List() a:List[Nothing] = List() print(a.length) a.length ...
- SQL Server 2008用'sa'登录失败,启用'sa'登录的办法
首先”为什么用sa登录不了,提示登录失败呢?" 当然,自己装SQL Server 2008的时候根本就没有用sa登录的方法,装数据库的时候是用windows身份登录的. 如果要启用用户名为“ ...