项目中使用了rapidjson 的库函数,然后将这个库分别编译进入了不同的动态库中,然后产品的动态库设计上要能实现动态的卸载和装载 然后就遇到了问题。
具体的表现就是 打开的动态库无法被卸载。
工程的获取地址如下:

https://gitee.com/jeasonb/dlclose

建议实际运行一下工程体验一下
工程框图 如下

解决方法

# 编译选项中 加入 -fno-gnu-unique
# set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-fno-gnu-unique" )
# set(CMAKE_C_FLAGS   ${CMAKE_C_FLAGS}   "-fno-gnu-unique" )

以上截图的语句中的 -fno-gnu-unique 语句是解决问题的关键
详细的解释可以参考这里

https://www.shuzhiduo.com/A/A7zgRmxld4/

引发问题的关键点就是

STB_GNU_UNIQUE属性的符号,在链接时只会有一份,即使这些符号分布在不同的so之间。就算由于模板函数中的静态变量是STB_GNU_UNIQUE属性,导致改模板函数即使在不同的so中各实例化了一份代码,也要使用同一个静态变量。

效果演示


前后两次运行工程的主要差异就是这里 加了 编译选项可以正常卸载,不加编译选项不能卸载!!!!!

1. 无法卸载的情形

[xxx@xxx:~/rapidjsonTest/build → master]$ ./app
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1236
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....
liblib2.so loaded ...
testFun ... a= 1237
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 8
this is 1 ... a = 9
this is 1 ... a = 10
this is 1 ... a = 11
this is 1 ... a = 12
this is 1 ... a = 13
this is 1 ... a = 14
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....
liblib2.so loaded ...
testFun ... a= 1238
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 15
this is 1 ... a = 16
this is 1 ... a = 17
this is 1 ... a = 18
this is 1 ... a = 19
this is 1 ... a = 20
this is 1 ... a = 21
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....
liblib2.so loaded ...
testFun ... a= 1239
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 22
this is 1 ... a = 23
this is 1 ... a = 24
this is 1 ... a = 25
this is 1 ... a = 26
this is 1 ... a = 27
this is 1 ... a = 28
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....
liblib2.so loaded ...
testFun ... a= 1240
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 29
this is 1 ... a = 30
this is 1 ... a = 31
this is 1 ... a = 32
this is 1 ... a = 33
this is 1 ... a = 34
this is 1 ... a = 35
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....
liblib2.so loaded ...
testFun ... a= 1241
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 36
this is 1 ... a = 37
this is 1 ... a = 38
this is 1 ... a = 39
this is 1 ... a = 40
this is 1 ... a = 41
this is 1 ... a = 42
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....
liblib2.so loaded ...
testFun ... a= 1242
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 43
this is 1 ... a = 44
this is 1 ... a = 45
this is 1 ... a = 46
this is 1 ... a = 47
this is 1 ... a = 48
this is 1 ... a = 49
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded  .....

2. 可以卸载的情形

[xxx@xxxx:~/rapidjsonTest/build → master]$ ^C
[xxx@xxx:~/rapidjsonTest/build → master]$ make
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/rapidjsonTest/build
Scanning dependencies of target lib2
[ 16%] Building CXX object CMakeFiles/lib2.dir/2.cpp.o
[ 33%] Linking CXX shared library liblib2.so
[ 33%] Built target lib2
Scanning dependencies of target lib1
[ 50%] Building CXX object CMakeFiles/lib1.dir/1.cpp.o
[ 66%] Linking CXX shared library liblib1.so
[ 66%] Built target lib1
[ 83%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
[xxx@xxxx:~/rapidjsonTest/build → master]$ ./app
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9030
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded  .....
liblib2.so unloaded  .....
^C
[xxx@xxxx:~/rapidjsonTest/build → master]$

嵌入式linux学习笔记-- 记录一种dlopen 打开的动态库无法被卸载的情形,情形分析以及对应的解决方法相关推荐

  1. 迅为嵌入式Linux学习笔记4——进程

    迅为嵌入式Linux学习笔记4--进程 进程指的是正在运行的程序,是操作系统分配资源的最小单位. 进程ID 每个进程都有唯一的标识符,这个标识符就是进程ID,简称pid 进程间通信的方法 管道通信:分 ...

  2. 迅为嵌入式Linux学习笔记5——进程间通信

    迅为嵌入式Linux学习笔记5--进程间通信 管道通信 无名管道 无名管道只能实现有亲缘关系的进程之间的通信,比如父子进程. pipe函数: #include <unistd.h> int ...

  3. 嵌入式linux学习笔记--TCP通讯整理

    嵌入式linux学习笔记–TCP通讯整理 之前的项目中使用到了比较多的tcp 通讯相关的知识,一直也没有进行整理,今天准备拿出时间好好的整理一下TCP通讯的整个过程.预计会整理linux和window ...

  4. 嵌入式linux学习笔记-- 对于动态库的一些操作 dlopen

    最近公司重构代码,看到了公司的一位经验丰富的工程师的一些C++ 操作 属实有被秀到,估计光看他写的代码都够我写很多总结了. 根据他写的代码以及公司未来的代码的一些规划 我也总结一些无关痛痒的知识吧. ...

  5. 嵌入式Linux学习笔记—fastboot烧写Android

    本系列为本人在自学过程中的学习笔记,如有错误欢迎大家指正. 学习资料为讯为ITOP4412开发板. fastboot烧写Android 1.主要工具 OTG 接口烧写方式也叫 fastboot 烧写方 ...

  6. 【linux学习笔记】嵌入式linux学习笔记

    目录: 1.SWAP 交换分区 2.GRUB  3.块设备和字符设备  4.shell 7.静态函数库\动态库 8.交叉编译 9.系统调用 10.文件 I/O编程 11.进程和线程 12.磁盘和文件系 ...

  7. 嵌入式linux学习笔记(一)

    最近开始学习linux驱动编写,目前直接使用jz2440已移植好的系统配合视频开始学习驱动编写,但是总是出现这样那样的问题.于是决定重头开始,先自己移植内核,在开始驱动学习. 今天参照<嵌入式l ...

  8. 嵌入式Linux学习笔记(1-2)——vi编辑器

    vi编辑器是linux系统自带的文本编辑工具,它小巧玲珑,很多开发者对其爱不释手.不过由于大部分程序员已经习惯在windows上使用各种功能更强大的文本编辑器编写代码,转而使用vi编辑器写代码是一件特 ...

  9. 嵌入式Linux学习笔记(1-1)——linux系统搭建

    版权声明:本文为博主原创文章,未经博主允许不得转载. 学习嵌入式linux已经有2年时间,虽然时间不长,但一路走来遇到很多问题,绕了很多弯路.写这篇文章的目的是分享我的经验,以供初学者参考,希望能够帮 ...

  10. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

最新文章

  1. MySQL存储写入速度慢分析
  2. Android表格布局(Table Layout)
  3. 《现代操作系统》第4章读书笔记--文件系统(未完成)
  4. YTU 2586: 填空题B-字画鉴别
  5. 《磨难之间》——刻意设计,缺失核心
  6. 对python编程做介绍-python002-编程语言介绍
  7. 2018年NLP技术学习总结
  8. java web重定向_Javaweb学习之资源重定向与请求转发
  9. Android项目中嵌入Cocos游戏项目
  10. 河北源达投顾:用专业教学,用智能解决选股烦恼
  11. 小程序页面简单功能模块化之取整
  12. 【JavaScript】为什么是script error.
  13. lua报错:1: unfinished string near ‘<eof>‘
  14. R语言ggridges包绘制漂亮的峰峦图(山脊图)-下篇
  15. 李峋同款爱心代码Python版
  16. 拓嘉辰丰:拼多多直播推广的付费模式有哪些?
  17. 平安好房想灭房产中介靠不靠谱?
  18. 21天战拖记——Day21:《小强升职记》学习感受(2014-05-24)
  19. Accurate, Dense, and Robust Multi-View Stereopsis论文分析与代码实现(一)
  20. 定时向QQ推送天气消息

热门文章

  1. Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
  2. python中os.path.join()路径的注意点
  3. matlab分析裂纹图像,matlab裂纹识别,关键代码
  4. 第4课 - 顶层父类的创建
  5. OrionX(猎户座)AI加速器资源池化软件赋能深度学习分布式训练
  6. 在这个多变的职场环境下,如何能够更加高效的学习
  7. 香港中文大学计算机辅助翻译课程,港中文翻译(MA in Translation)专业申请解析...
  8. (赠源码)springboot+Mysql流浪动物救助系统78174-计算机毕业设计
  9. 自适应的世界:带你了解CSS3中的四大元素尺寸属性值:fit-content / fill-available / max-content / min-content.
  10. html.gmt文件,[转载]使用GMT的psxy命令画各种符号