.so文件在linux中正如.dll文件在windows中,作为动态链接库,该类型的文件有着极其重要的作用。那如何自己编写.so文件呢,编写的文件如何使用呢?
首先我们的源文件如下所示
hello.h
#include <stdio.h>
#include <stdlib.h>
void hello();
hello.c
#include "hello.h"
void hello()
{
printf("this is in hello...\n");
}
我们就是打算将这两个文件编译成.so文件 使用命令 gcc hello.c -shared -fPIC -o libhello.so就可以得到文件名为libhello.so的文件了。
其中 -shared选项说明编译成的文件为动态链接库,不使用该选项相当于可执行文件
-fPIC 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的。所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
hello_b.c
<pre name="code" class="cpp">#include "hello.h"
int main()
{
hello();
return 0;
}
编译该文件gcc hello_b .c-L. -lhello hello 生成hello文件
其中-L. 表示链接的文件在当前目录下
-lhello 代表链接的文件名 gcc会自动为其前面添加lib,在其后边添加.so 即libhello.so
使用ldd hello会看到可执行文件hello所有链接的动态库,你会发现libhello.so显示的是找不到文件,所以需要修改环境变量。
export LD_LIBRARY_PATH=your path : $LD_LIBRARY_PATH:
这条命令相当与在LD_LIBRARY_PATH前追加一个路径,也就是你的动态链接库所在的路径,当运行hello的时候会先去访问该路径,找不到则依次往后查找。