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 ...
随机推荐
- android:descendantFocusability=”blocksDescendants”的用法
android:descendantFocusability用法简析 开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承B ...
- OC语言-04-OC语言-核心语法
一.点语法 1> 基本使用 点语法本质上是set方法/get方法的调用 2> 使用注意 若出现在赋值操作符的右边,在执行时会转换成get方法 若出现在赋值操作符的左边,在执行时会转换成se ...
- UVa 100 - The 3n + 1 problem(函数循环长度)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- android基础开发之WebView
WebView 是android平台沟通 http & H5 页面的桥梁. 但是google对这块的表述不是很清晰,而且SDK里面基本看不到源码,只有一个接口而已. 传送:http://dev ...
- JavaScript Patterns 3.7 Primitive Wrappers
Primitive value types: number, string, boolean, null, and undefined. // a primitive number var n = 1 ...
- 标准sql语句,学习
标准SQL语句总结标准SQL语句总结,标准SQL语言基本上适用于下面所列出的数据库软件 -------------------------------------------------------- ...
- Mysql的float类型造成的困扰总结
因为换了工作正在学习使用MySQL,今天领导提出了一个问题,如下: X列是累加值,A列是每日新增值,那么X2应该是X1+A2,而且存储过程里也是这样计算的.可是奇怪的是X2的值却总是和正确值(2396 ...
- 关于CPU Cache:程序猿需要知道的那些
天下没有免费的午餐,本文转载于:http://cenalulu.github.io/linux/all-about-cpu-cache/ 先来看一张本文所有概念的一个思维导图: 为什么要有CPU Ca ...
- poj 3237 Tree [LCA] (树链剖分)
poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...
- Linux 磁盘与文件系统管理
介绍一本书叫<Linux 鸟哥私房菜>, 一本教人用linux很经典的一本书,这两天又看了里面的一章节,做一点笔记.有一些很细节的东西的, 在平时运用过很容易被忽略. 1)U盘使用的文件格 ...