so文件在linux中为共享库,与windows下的dll类似。
so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用。
共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性的时候,用户只需要获得升级后的so并安装他就可以。
注意:即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间。
so文件编译方法
--so文件的源文件中不需要main函数,即使有也不会被执行。
--编译的时候gcc需要加-fPIC选项,这可以使gcc产生与位置无关的代码。
  在操作系统中,执行一个进程的时候,会将这个进程的代码加载到内存,系统为这段程序分配一个入口地址(一般就是main函数的地址),这个程序中的其他函数的地址都是相对地址(相对于入口地址),所以在进程中,只有程序的入口地址是绝对地址,其他函数的地址都是相对  地址,对于so共享库文件,在编译的时候不需要给so文件相对地址,因为so文件没有入口地址,它是用来被其他进程调用的
--链接的时候gcc使用-shared选项,指示生成一个共享库文件。
--共享库文件名要以lib开头,扩展名为.so。

so文件使用方法
--为了让Linux能找到so文件的位置,需要在.bash_profile中添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.因为linux默认不在当前目录下寻找可执行文件,so也是可执行文件,所以so文件也需要配置环境变量,增加在本地查找。
--或者将so文件放入linux系统目录/user/lib(不建议这么做)
--在c文件中使用so文件,首先需要#include相关的.h文件。
--gcc链接时添加 -L参数指明so文件存放路径,-l(L)参数执行so文件名以libtest.so文件在当前路径下举例: gcc -L. -ltest -o a a.o其中-L.意思是在当前路径下寻找so文件-ltest意思为要链接libtest.so这个库文件-o a意思是编译后可执行文件名为a

当我们在cpp文件中包含test.h文件,用g++连接libtest.so这个库会报错
为了使我们编写的so文件同事可以被c或者c++调用,我们需要修改一下h文件中的函数声明部分。
增加带有__cplusplus(两个下划线)的预编译指令。
__cplusplus(两个下划线)是c++编译器预定义的一个宏,比如用g++的时候这个宏就被提前定义了。
extern "C"  extern这个是c++下的关键字,C语言没有这个关键字,表示这是一个C语言函数
--注意:"C"这个字符是大写

在动态链接库中查找某一个函数是否存在以及函数入口地址:
假设动态链接库为yourLib.so,函数名字为yourFunction,则如下:

nm -D yourLib.so |grep -w yourFunction

Linux Linux共享库相关推荐

  1. Linux下共享库的查找顺序

    http://www.cnblogs.com/lovevivi/archive/2013/01/15/2861211.html 在接手一个很古老的程序时,发现其所使用的动态库都实在是太陈旧了,正式运行 ...

  2. linux 下共享库创建及使用

    1.创建共享库 [xpan@localhost 2.5.3]$ ls libhello.c  libhello.h  usehello.c [xpan@localhost 2.5.3]$ gcc -f ...

  3. linux下共享库的制作及常见的问题

    将自己写的链表生成共享库  1.编译  2.设置库名:    库的名称格式:lib + XXX + 版本号.so (库的名称为XXX) -shared 生成共享文件库 -fpic 动态链接    3. ...

  4. linux 共享库目录,Linux共享库

    共享库 从文件结构上讲,共享库和共享对象没什么区别,Linux下共享库就是普通的ELF共享对象.由于共享对象可以被各个程序之间共享,所以它也就成为了库的很好的存在形式,很多库的开发者都以共享对象的形式 ...

  5. Linux命令把共享库export,Linux Linux共享库

    so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性 ...

  6. 共享库中的位置无关代码(PIC)

    原作者:Eli Bendersky http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-li ...

  7. 检查可执行文件所需要的共享库

    1.3 ldd 和 ldconfig ldd 是用来检查可执行文件所需要的共享库.例如: $ ldd /bin/ls libtermcap.so.2 => /lib/libtermcap.so. ...

  8. 静态库与动态库(共享库)的联系与区别

    提要: 1.静态库                 静态库,也称作归档库(archive),按惯例它们的文件名都以.a结尾.比如,标准C语言函数库/usr/lib/libc.a和X11函数库/usr/ ...

  9. 静态库,共享库,动态库 elf格式的

    3.2 使用     3.3 环境变量    3.4 创建共享库    3.5 安装与使用    3.6 兼容性  4.动态加载    4.1 dlopen()    4.2 dlerror()    ...

  10. nux下共享库(SO)有关的几个环境变量 zz

    Linux支持共享库已经有悠久的历史了,不再是什么新概念了.大家都知道如何编译.连接以及动态加载(dlopen/dlsym/dlclose) 共享库.但是,可能很多人,甚至包括一些高手,对共享库相关的 ...

最新文章

  1. seaborn clustermap详解及绘制
  2. Virtex-6中的SelectIO模块
  3. npm install是什么命令_了解npm
  4. 简单多进程任务处理程序
  5. MariaDB 10之并行复制--延迟测试结果
  6. 免费录屏、最快截图、装X必备、看完工作学习效率直接翻倍
  7. wordpress中直接执行mysql查询语句的常用方法
  8. django之视图view小知识
  9. 后端-SpringBoot MySql 连接语句
  10. OpenGL超级宝典 绘制第一个三角形
  11. 0-1背包问题、贪心算法、动态规划
  12. 精英反向黄金正弦鲸鱼算法-附代码
  13. 阿里云学生服务器购买教程(附用途案例)
  14. 描述12个异性追求者(互动媒体技术作业)
  15. 香港主机与美国主机的相同点和不同点
  16. Android Studio如何建立VR视频
  17. Maven(保姆级全详)新手入门
  18. 计算机网络校园网服务器搭建,计算机网络校园网服务器搭建课程设计(绝对等级).doc...
  19. cross-entropy for one-stage detecor
  20. 「游戏」c++ 炸弹人2.0(新增人机)

热门文章

  1. python 清空文件夹_别这样直接运行Python命令,否则电脑等于“裸奔”
  2. python人脸识别防小偷_Python人脸识别
  3. 5.4php-fpm配置,CentOS5.4下配置Nginx0.8.33+PHP5.3+PHP-fpm+MySQL5.5
  4. java动态工程_eclipse 创建maven 项目 动态web工程完整示例
  5. html研究中心,新媒体研究中心.html
  6. Android模拟器远程,使用Android模拟器进行远程调试
  7. 学计算机专业能上国家电网吗,高考结束后,选择什么专业能进入国家电网?这些专业考生应该知道...
  8. flask response响应
  9. shell 条件控制语句
  10. 4.4 Triplet 损失