参考

  • 关于如何在linux环境下生成a库和so库
  • Linux链接库一(动态库,静态库,库放在什么路径下)
  • linux 中的.so和.a文件
  • linux中的ldd命令简介

1. 如何生成和使用.so(shared object)动态链接库(dynamic link libaray)

  1. 已有test.c和test.h文件。然后执行

    gcc -fPIC -shared test.c -o libtest.so
    
  2. 在hello.c文件中引用test.h及其中的函数。然后执行

    gcc hello.c -o hello -ltest -L.
    

    其中-L[path]告诉编译器库文件的位置,以便链接

  3. 此时运行./test仍然失败,报错库文件无法加载。加载库文件有三种方法:

    • 把库文件所在路径加入 /etc/ld.so.conf 中然后运行sudo ldconfig。因为动态库的特性,编译器会到指定的目录去寻找动态库,目录的地址在 /etc/ld.so.conf.d/ 目录里的libc.conf文件里,你可以在里面加一行地址表示你so库的位置,更改完conf文件里的内容,记得输入命令行:sudo ldconfig。(我试了一下,但没成功)

    • 把库文件所在路径加入环境变量LD_LIBRARY_PATH

      export LD_LIBRARY_PATH=[path]:$LD_LIBRARY_PATH
      
    • 把库文件复制到 /lib/ 或者 /usr/lib/ 文件夹下。这样的话,链接器加载器就都可以准确的找到该库了,在第二步中也无需使用-L[path]指明库文件位置。

2. ldd(list dynamic dependencies)指令:列出动态库依赖关系

hanjiale@hanjiale-VirtualBox:~/Documents/so-test$ ldd libtest.so:linux-vdso.so.1 =>  (0x00007fff385cf000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f932c7c3000)/lib64/ld-linux-x86-64.so.2 (0x00007f932cd8f000)
hanjiale@hanjiale-VirtualBox:~/Documents/so-test$ ldd testlinux-vdso.so.1 =>  (0x00007ffc90d01000)libtest.so => not foundlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0839007000)/lib64/ld-linux-x86-64.so.2 (0x00007f08393d1000)

3. 动态链接库的优点

  1. 可以实现进程之间的资源共享:所有使用某个库的程序可以只共享一份副本(节约空间)。

    什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。

  2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。

  3. 甚至可以真正坐到链接载入完全由程序员在程序代码中控制。

    程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。

.so动态链接库文件相关推荐

  1. linux下Makefile中包含有shared library动态链接库文件时候的简单例子

    如果不知道什么是makefile,可以首先看我的另一篇博客: linux下Makefile的简单例子及解释 http://www.cnblogs.com/lihaozy/archive/2012/08 ...

  2. VB无所不能之五:建立“标准”DLL动态链接库文件(1)

    VB无所不能之五:建立"标准"DLL动态链接库文件(1) --作者:钟声 博客地址:http://useway.blog.51cto.com 动态链接库经常被认为是VC或者Deph ...

  3. 怎样用VB编写.DLL动态链接库文件 1

    怎样用VB编写.DLL动态链接库文件 编号: QA000507     建立日期: 1999年2月10日 最后修改日期: 2006年8月13日 所属类别: Visual Basic - 其他方面   ...

  4. VisualStudio 制作Dynamic Link Library动态链接库文件

    Dynamic Link Library动态链接库文件 目录 工具集 如何生成 __declspec(dllexport) extern "C" 如何使用 声明调用 Example ...

  5. dll动态链接库文件编写

    1.动态链接库(dll)概述 没接触dll之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息.它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其 ...

  6. CentOS7下实验之手动删除动态链接库文件并用光盘救援模式恢复系统实验

    1.实验说明: Linux下的链接库文件分为静态链接库和动态链接库的文件:静态链接库的特点是把程序对应的依赖库复制一份到包并嵌入程序包,在Linux中一般为.a后缀的文件,升级难,需要重新编译,占用较 ...

  7. .h头文件 .lib动态链接库文件 .dll 动态链接库

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

  8. 如何查看linux动态链接库文件的版本等其他信息

    ldd <可执行文件名> 查看可执行文件链接了哪些 系统动态链接库nm <可执行文件名> 查看可执行文件里面有哪些符号strip <可执行文件名> 去除符号表可以给 ...

  9. 【linux基础】CMake如何生成动态链接库文件

    CMakeLists.txt SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib) ADD_LIBRARY(filename SHARED ${CURREN ...

  10. .h头文件 .lib库文件 .dll动态链接库文件关系

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

最新文章

  1. 牛客网 华为机试题 数据重复的筛选问题记录
  2. Linux 自定义命令
  3. 提取ESX/ESXI4.0脚本安装文件ks.cfg、ks-first.cfg和ks-first-safe.cfg
  4. Runner站立会议08
  5. 数据仓库与ODS的区别
  6. Spring 的@Bean 的用法
  7. iOS 模糊化效果 ANBlurredImageView的使用
  8. saltstack (6) 配置管理(2)
  9. ios微信支付失败 php,iOS 微信支付疑难杂症。
  10. python怎么编辑文件_如何使用python中的方法对文件进行修改文件名
  11. Mac操作指南:废纸篓里的文件无法清除如何解决?
  12. HTTP长连接和短连接
  13. 关于word无法创建工作文件,请检查临时环境变量(本人已解决)
  14. .Net Core WebApi 模型验证的处理
  15. 合肥工业大学的计算机专业的导师,合肥工业大学计算机与信息学院硕士生导师:程运安副教授...
  16. 机器人聊天软件c#_我的C#之路之简单的聊天机器人。
  17. 本科三本的计算机博士,读书中的我——从三本本科到985博士
  18. python 统计.txt中比较句个数,五元组的个数、以及有多少重复的op(以五元组为统计单位)
  19. [硬件]导热垫(Thermal Pad)和导热过孔(Via for thermal pad)
  20. Eigen介绍及简单使用

热门文章

  1. java对象的内存分配_java对象在内存的分配问题
  2. java equals getclass_Java equals()方法 – 子类中equals的语义如何确定getClass和instanceof的使用...
  3. x3-02 java,Android Studio 3.2.1 - 新项目无法运行
  4. python cmdb_python相关cmdb系统
  5. python魔法方法和普通方法_Python魔法方法之属性访问详解!
  6. html游戏贪吃蛇代码,html5贪吃蛇游戏使用63行代码完美实现
  7. 解刨一台计算机,解剖一台计算机.doc
  8. beetl调用java方法_08.自定义方法以及直接访问java类方法---《Beetl视频课程》
  9. nlp-tutorial代码注释1-1,语言模型、n-gram简介
  10. 分类 Classification