首页 > 代码库 > Linux Linux共享库

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"这个字符是大写

 

Linux Linux共享库