Linux下编译链接动态库符号问题
一般大型的项目会有许多个动态库、静态库。许多个库可能会有符号冲突的问题,如果不对符号进行管理,会引发各种意想不到的问题。
一、隐藏静态库的符号
参数:-Wl,--exclude-libs,ALL
应用场景:A.so 依赖了B.a,A.so不想对外提供B.a中的接口。
解决的问题:A.so和C.so同时依赖的B.a,如果B.a中有一个全局变量,并提供了两个函数Set和Get。此时,A调用Set后再调用Get,可能会Set调用的是A中的,Get调用的是C中的,导致程序运行不符合预期。这个问题也告诉我们静态库要设计成无状态的、幂等的。
二、链接时执行全链接
参数:-Wl,-z,defs
解决问题:动态库编译没问题,但是动态加载时提示undefined reference to错误:
A.so中定义了funcA但是没有实现,此时已然可以连接通过。但是在运行期间如果跑到了funcA,就会引发程序崩溃并且不产生core文件。
参考: 动态库编译加入参数:-Wl,-z,defs 编译期即可发现undefined reference to错误_tl_sunshine的博客-CSDN博客_-z,defs
三、隐藏符号
参数:-fvisibility=hidden
另外在需要导出的函数、类名前添加:__attribute__ ((visibility("default")))
应用场景:A.so只想暴露对外提供的符号。许多符号只运行内部使用。
解决问题: 多个库定义了相同的符号,运行时交叉调用导致功能异常。比如A.so和B.so都定义了func,但是A的func和B的func的实现是不一致的。如果两个符号都对外暴露了,运行期间可能会调用到非预期的func。
注意:隐藏符号,在某些情况下可能会引起单例变多例的问题。
Linux下编译链接动态库符号问题相关推荐
- gcc编译链接动态库
文章目录 前言 操作步骤 1.直接生成目标so文件 2.先生成.o中间文件再链接成目标so文件 总结 前言 以下内容主要作为学习记录,有不准确的地方希望帮忙指出来,谢谢 以下是本篇文章正文内容,下面示 ...
- linux动态库路径生效,Linux下如何解决动态库的链接问题
原标题:Linux下如何解决动态库的链接问题 静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有 ...
- linux取消头文件链接,【原创】Linux下编译链接中常见问题总结
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...
- linux如何编译boost指定库,linux下编译安装boost库
linux下编译安装boost库 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15 UTC 2015 x ...
- vs可以调用java接口吗_关于vs2010下编译dll动态库,JNA接口在java中调用的问题
最近在搞关于把vs2010中的project,使之能够在Java下面运行,有一个调用本地接口的问题,JNI那个涉及到复杂细节太多,就使用了最新的JNA(java native access) 网上也给 ...
- 查看linux下程序或者动态库到底依赖哪些so动态库以及对应的版本
一. ldd命令 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls linux-vdso.so.1 => (0x00 ...
- linux命令之查看动态库符号-nm
在调用动态库的时候,经常出现由于动态库接口修改或者版本不匹配导致调用动态库找不到函数接口符号的情况. 原因可能有如下几种: 1.由于c++动态库编译没有加extern c导致函数编译时加了c++的前缀 ...
- linux编译pcre生成动态链接库,Linux下编译安装PCRE库
最近在学习nginx,nginx rewrite依赖于PCRE库,所以需要在linux系统中编译安装PCRE库.具体步骤如下: 1.下载PCRE包 首先去官网下载pcre的安装包 如果通过FTP的方式 ...
- linux 保存编译log,(转)Linux下编译安装log4cxx
一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...
- linux php7.2编译安装,Linux下编译安装php7.2
准备工作 所有操作需要在root用户下 安装路径: /usr/local/php 安装PHP 首先要安装如下依赖包 $ yum install -y gcc gcc-c++ make zlib zl ...
最新文章
- python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解
- 【学习笔记】超简单的多项式求指(含泰勒展开式、牛顿迭代完成证明)
- 使用opencv自带的融合函数
- 三菱plc编程实例3000_三菱PLC十字路口的红绿灯编程实例
- struts实战--登陆拦截器
- VS 中配置使用Visual SVN系列 三:TortoiseSVN Client(客户端)下载和安装
- 环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理
- linux修改grub权限,linux下肿么修改grub.cfg
- C++函数指针和类成员函数指针
- delphi FastReport 安装方法
- Java拦截器的简单使用
- 代码调试全指南-自然语言处理-基于预训练模型的方法,车万翔
- ps的切片用来转换html,Photoshop切片导出HTML+CSS
- Motion Planning中的问题与挑战
- (无任何网络配置,纯代码实现) 一个组件,一个hook,让你在本地开发环境中拿到微信code
- JS输出26个英文大小写字母
- 使用php制作导航栏,如何制作简单导航栏
- 支付宝钱包系统架构内部剖析
- JavaScript进阶(一)
- astash制作UML类图 简单入门教程