一般大型的项目会有许多个动态库、静态库。许多个库可能会有符号冲突的问题,如果不对符号进行管理,会引发各种意想不到的问题。

一、隐藏静态库的符号

参数:-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下编译链接动态库符号问题相关推荐

  1. gcc编译链接动态库

    文章目录 前言 操作步骤 1.直接生成目标so文件 2.先生成.o中间文件再链接成目标so文件 总结 前言 以下内容主要作为学习记录,有不准确的地方希望帮忙指出来,谢谢 以下是本篇文章正文内容,下面示 ...

  2. linux动态库路径生效,Linux下如何解决动态库的链接问题

    原标题:Linux下如何解决动态库的链接问题 静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有 ...

  3. linux取消头文件链接,【原创】Linux下编译链接中常见问题总结

    前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...

  4. 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 ...

  5. vs可以调用java接口吗_关于vs2010下编译dll动态库,JNA接口在java中调用的问题

    最近在搞关于把vs2010中的project,使之能够在Java下面运行,有一个调用本地接口的问题,JNI那个涉及到复杂细节太多,就使用了最新的JNA(java native access) 网上也给 ...

  6. 查看linux下程序或者动态库到底依赖哪些so动态库以及对应的版本

    一. ldd命令 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 # ldd /bin/ls linux-vdso.so.1 => (0x00 ...

  7. linux命令之查看动态库符号-nm

    在调用动态库的时候,经常出现由于动态库接口修改或者版本不匹配导致调用动态库找不到函数接口符号的情况. 原因可能有如下几种: 1.由于c++动态库编译没有加extern c导致函数编译时加了c++的前缀 ...

  8. linux编译pcre生成动态链接库,Linux下编译安装PCRE库

    最近在学习nginx,nginx rewrite依赖于PCRE库,所以需要在linux系统中编译安装PCRE库.具体步骤如下: 1.下载PCRE包 首先去官网下载pcre的安装包 如果通过FTP的方式 ...

  9. linux 保存编译log,(转)Linux下编译安装log4cxx

    一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...

  10. linux php7.2编译安装,Linux下编译安装php7.2

    准备工作 所有操作需要在root用户下 安装路径: /usr/local/php 安装PHP 首先要安装如下依赖包 $ yum install -y gcc gcc-c++  make zlib zl ...

最新文章

  1. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解
  2. 【学习笔记】超简单的多项式求指(含泰勒展开式、牛顿迭代完成证明)
  3. 使用opencv自带的融合函数
  4. 三菱plc编程实例3000_三菱PLC十字路口的红绿灯编程实例
  5. struts实战--登陆拦截器
  6. VS 中配置使用Visual SVN系列 三:TortoiseSVN Client(客户端)下载和安装
  7. 环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理
  8. linux修改grub权限,linux下肿么修改grub.cfg
  9. C++函数指针和类成员函数指针
  10. delphi FastReport 安装方法
  11. Java拦截器的简单使用
  12. 代码调试全指南-自然语言处理-基于预训练模型的方法,车万翔
  13. ps的切片用来转换html,Photoshop切片导出HTML+CSS
  14. Motion Planning中的问题与挑战
  15. (无任何网络配置,纯代码实现) 一个组件,一个hook,让你在本地开发环境中拿到微信code
  16. JS输出26个英文大小写字母
  17. 使用php制作导航栏,如何制作简单导航栏
  18. 支付宝钱包系统架构内部剖析
  19. JavaScript进阶(一)
  20. astash制作UML类图 简单入门教程

热门文章

  1. 通用代码:发送短信并显示倒计时
  2. python量化交易策略实例_Python进阶量化交易:听说有个回测框架叫backtrader
  3. Selenium获取浏览器Network数据包
  4. IT规划的两大困惑及未来之路
  5. windows下谷歌邮箱注册及谷歌浏览器登录
  6. 刽子手c语言,麻烦刽子手程序在C
  7. 开启windows10系统组策略更新、开启Windows自动更新、关闭自动更新
  8. 资源下载源码极致cms精纺资源网的模板整站源码
  9. 用友网络发布惠商云平台 五大价值构建企业互联网新生态
  10. 购物车一个Adaper,可以删除,全选反选,数量加减