Linux Linux共享库
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共享库相关推荐
- Linux下共享库的查找顺序
http://www.cnblogs.com/lovevivi/archive/2013/01/15/2861211.html 在接手一个很古老的程序时,发现其所使用的动态库都实在是太陈旧了,正式运行 ...
- linux 下共享库创建及使用
1.创建共享库 [xpan@localhost 2.5.3]$ ls libhello.c libhello.h usehello.c [xpan@localhost 2.5.3]$ gcc -f ...
- linux下共享库的制作及常见的问题
将自己写的链表生成共享库 1.编译 2.设置库名: 库的名称格式:lib + XXX + 版本号.so (库的名称为XXX) -shared 生成共享文件库 -fpic 动态链接 3. ...
- linux 共享库目录,Linux共享库
共享库 从文件结构上讲,共享库和共享对象没什么区别,Linux下共享库就是普通的ELF共享对象.由于共享对象可以被各个程序之间共享,所以它也就成为了库的很好的存在形式,很多库的开发者都以共享对象的形式 ...
- Linux命令把共享库export,Linux Linux共享库
so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性 ...
- 共享库中的位置无关代码(PIC)
原作者:Eli Bendersky http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-li ...
- 检查可执行文件所需要的共享库
1.3 ldd 和 ldconfig ldd 是用来检查可执行文件所需要的共享库.例如: $ ldd /bin/ls libtermcap.so.2 => /lib/libtermcap.so. ...
- 静态库与动态库(共享库)的联系与区别
提要: 1.静态库 静态库,也称作归档库(archive),按惯例它们的文件名都以.a结尾.比如,标准C语言函数库/usr/lib/libc.a和X11函数库/usr/ ...
- 静态库,共享库,动态库 elf格式的
3.2 使用 3.3 环境变量 3.4 创建共享库 3.5 安装与使用 3.6 兼容性 4.动态加载 4.1 dlopen() 4.2 dlerror() ...
- nux下共享库(SO)有关的几个环境变量 zz
Linux支持共享库已经有悠久的历史了,不再是什么新概念了.大家都知道如何编译.连接以及动态加载(dlopen/dlsym/dlclose) 共享库.但是,可能很多人,甚至包括一些高手,对共享库相关的 ...
最新文章
- seaborn clustermap详解及绘制
- Virtex-6中的SelectIO模块
- npm install是什么命令_了解npm
- 简单多进程任务处理程序
- MariaDB 10之并行复制--延迟测试结果
- 免费录屏、最快截图、装X必备、看完工作学习效率直接翻倍
- wordpress中直接执行mysql查询语句的常用方法
- django之视图view小知识
- 后端-SpringBoot MySql 连接语句
- OpenGL超级宝典 绘制第一个三角形
- 0-1背包问题、贪心算法、动态规划
- 精英反向黄金正弦鲸鱼算法-附代码
- 阿里云学生服务器购买教程(附用途案例)
- 描述12个异性追求者(互动媒体技术作业)
- 香港主机与美国主机的相同点和不同点
- Android Studio如何建立VR视频
- Maven(保姆级全详)新手入门
- 计算机网络校园网服务器搭建,计算机网络校园网服务器搭建课程设计(绝对等级).doc...
- cross-entropy for one-stage detecor
- 「游戏」c++ 炸弹人2.0(新增人机)
热门文章
- python 清空文件夹_别这样直接运行Python命令,否则电脑等于“裸奔”
- python人脸识别防小偷_Python人脸识别
- 5.4php-fpm配置,CentOS5.4下配置Nginx0.8.33+PHP5.3+PHP-fpm+MySQL5.5
- java动态工程_eclipse 创建maven 项目 动态web工程完整示例
- html研究中心,新媒体研究中心.html
- Android模拟器远程,使用Android模拟器进行远程调试
- 学计算机专业能上国家电网吗,高考结束后,选择什么专业能进入国家电网?这些专业考生应该知道...
- flask response响应
- shell 条件控制语句
- 4.4 Triplet 损失