本文讨论了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 动态库 静态库 函数覆盖的更多相关文章

  1. c/c++:动态库 静态库 linux/windows 例子 (转)

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...

  2. Linux库函数制作(静态库、动态库)

    Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依 ...

  3. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  4. Linux 下动态库 / 静态库(依赖)

    一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...

  5. linux+vs2013编译静态库和动态库

    Linux下创建与使用静态库 Linux静态库命名规则 Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为 ...

  6. Linux 动态库 静态库

    什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...

  7. linux下的静态库和动态库

    一.linux下的静态库   静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在!   二.linux下动态库的构建和使用 1.动态库的构建   ...

  8. Linux中的静态库与动态库

    什么是库文件? 库文件是事先编译好的方法的合集.比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,不需要重新编写. Linux系统中: 1.静态库的扩展名为.a:2. ...

  9. linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

    linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库   创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查 ...

随机推荐

  1. Java面向对象技术

    问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.2面向对象技术 1.面向对象与面向过程有什么区别? 看下面一个实例即可: 面向过程就是分析出解决问题所需要的步骤 ...

  2. 高斯混合模型(理论+opencv实现)

    查资料的时候看了一个不文明的事情,转载别人的东西而不标注出处,结果原创无人知晓,转载很多人评论~~标注了转载而不说出处这样的人有点可耻! 写在前面: Gaussian Mixture Model (G ...

  3. tornado-通过判断后台数据限制登陆--简单的

    import tornado.ioloop import tornado.web import tornado.httpserver # 非阻塞 import tornado.options # 提供 ...

  4. attack source code

    不废话,直接上代码, 先看截图use pictures;

  5. task 03-27

    To integrate  the spring with  jpa, Basically completed the jpa of study;To integrate  the spring wi ...

  6. 微信公众平台开发者认证,node

    纯属分享 app.js var express = require('express'); var path = require('path'); var app = express(); ; var ...

  7. 文件的基本操作(python)

    文件打开: 1. f = open('yesterday,‘r+’,encoding = ‘utf-8’) 读取的方式加载为Utf-8 r    打开文件并写, 只适用于文字类 r+   打开文件并读 ...

  8. H5-DataUrl FileReader

    DataUrl: 将二进制文件流以字符串的形式存在,如果是图片可以在页面上展示.经常用于Canvas截图或画图展示用. 格式:data:image/png;base64,****. /** * dat ...

  9. MySql DATE_FORMAT函数用法

    DATE_FORMAT(date, format) 函数用法 DATE_FORMAT(date, format) 函数根据format字符串格式化date值. 1.把字符串转为日期格式 实例: SEL ...

  10. asp.net core in centos

    CentOS 7部署ASP.NET Core应用程序   看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不 ...