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下共享库的注意点之-fpic
转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...
- Linux动态共享库
Linux操作系统上面的动态共享库大致分为三类: 一.操作系统级别的共享库和基础的系统工具库 libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/us ...
- Linux下共享库嵌套依赖问题 (转载)
转自:http://my.oschina.net/moooofly/blog/506466 问题场景: 动态库 librabbitmq_r.so 内部依赖动态库 libevent_core.so 和 ...
- linux下共享库的注意点之-fpic
在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n") ...
- linux C++ 共享库导出类
1.共享库的对外接口函数的声明必须加上extern “C”. 2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误. 以 ...
- linux共享库
linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...
- 【转载】Linux下动态共享库加载时的搜索路径详解
转载自:http://www.eefocus.com/article/09-04/71617s.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading ...
- Linux静态库和共享库
1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...
- Linux下动态共享库加载及使用详解【转】
原文地址:http://blog.chinaunix.net/uid-29025972-id-3855500.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while l ...
随机推荐
- C语言复习
- 一些在IOS中关于JS、H5开发的网站
1.JSPatch 2.
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
当Adobe.Microsoft.Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来!现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协 ...
- SQL Server 2008 R2——开发资料搜集
ADO手册 http://download.csdn.net/detail/wlsgzl/8501115 =============================================== ...
- 问题解决——OpenGL超级宝典 关于gltDrawTorus的错误解决
看OpenGL超级宝典的时候,遇到一个函数 “gltDrawTorus”,在TRANSFORM和SPHEREWORLD中都有用到.但是一开始在自己写示例代码里时却没法使用,而在作者的代码目录结构下却可 ...
- Javascript中replace()的一些用法总结
关于定义 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 关于语法 stringObject.replace(regexp/substr,repla ...
- sass+compass+bootstrap三剑合璧高效开发记录
1. 先搭建环境,下载node.js,rubyinstaller,安装, 安装rubyinstaller时,要选上include system path,这样就会自动将node.js执行添加到wind ...
- 原始的2文件的makefile错误
从来没系统的看过makefile文档,平时属于复制模板,用完即忘,下午尝试按自己的理解写一个最简单的makefile,含2个.c文件,1个.h文件,费了个把小时,参考别人的文章才弄出来,特记录. ma ...
- apache性能测试工具ab使用详解
下面我们对这些参数,进行相关说明.如下:-n在测试会话中所执行的请求个数.默认时,仅执行一个请求.-c一次产生的请求个数.默认是一次一个.-t测试所进行的最大秒数.其内部隐含值是-n 50000,它可 ...
- 【转载】chromium浏览器开发系列第一篇:如何获取最新chromium源码
背景: 最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧.于是乎,本文顺理成章.由于有些细节必需描述清楚,所以这次先讲如何拿到ch ...