Linux Linux共享库
2016-08-29 23:14
197 查看
so文件在linux中为共享库,与windows下的dll类似。 so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用。 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性的时候,用户只需要获得升级后的so并安装他就可以。 注意:即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间。 so文件编译方法 --so文件的源文件中不需要main函数,即使有也不会被执行。 --编译的时候gcc需要加-fPIC选项,这可以使gcc产生与位置无关的代码。 在操作系统中,执行一个进程的时候,会将这个进程的代码加载到内存,系统为这段程序分配一个入口地址(一般就是main函数的地址), 这个程序中的其他函数的地址都是相对地址(相对于入口地址),所以在进程中,只有程序的入口地址是绝对地址,其他函数的地址都是相对 地址,对于so共享库文件,在编译的时候不需要给so文件相对地址,因为so文件没有入口地址,它是用来被其他进程调用的 --链接的时候gcc使用-shared选项,指示生成一个共享库文件。 --共享库文件名要以lib开头,扩展名为.so。
![](https://images2015.cnblogs.com/blog/644743/201608/644743-20160829231301090-1870751566.png)
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"这个字符是大写
相关文章推荐
- Linux内核调试环境搭建(基于ubuntu12.04)
- Linux 删除文件夹和文件的命令
- Windows环境下搭建Linux虚拟机
- linux添加定时任务
- Linux进程隐藏
- Linux GCC常用命令
- iptables超全详解
- Linux命令之"grep"
- centos 网易源
- Linux命令总结
- centos外接屏幕调节方法
- linux下SVN冲突的解决方法
- Linux的IO调度
- Linux目录结构
- Linux第九周
- Openstack Mitaka for Centos7.2 部署指南(一)
- linux进程间通信之信号量
- 学习笔记12——Linux中的文件类型
- Linux 文件描述符
- linux中用shell获取昨天、明天或多天前的日期