Linux动态链接库.so文件的创建与使用

时间:2022-03-16 15:49:10

本文以一个简单的例子,介绍linux下动态库的创建和使用操作。其中就无法找到动态库文件的问题简单介绍处理办法。

动态链接库文件在windows平台下往往以.dll为后缀,而在linux平台则一般以.so为后缀,so是shared object的缩写
感觉在linux下构建动态链接库文件比在windows下省点功夫,使用gcc编译器的话,只需简单地在gcc命令行参数中加上-shared选项
以下是一个简单的例子:三个文件libtest.h, libtest.c和main.c。

libtest.c定义动态库函数,main.c调用动态库函数, 为简单起见,这三个文件保存在同一个目录中。
/*libtest.h*/
void test(void);

/*libtest.c*/
#include “stdio.h”

#include "libtest.h"
void test(void)
{
   printf("run test() in libtest.so\n");
}

/*main.c*/
#include "libtest.h"
int main(void)
{
    test();
    return 0;
}

以下是创建动态库文件的操作:
1、进入以上源文件所在目录
2、执行gcc libtest.c -fPIC -shared libtest.so
3、执行ls可发现当前目录下多了一个libtest.so的文件, 执行file libtest.so将打印该文件是一个ELF LSB shared-object file.
说明:步骤2的选项-fPIC表明创建的动态库文件是position independent code

以下是编译并生成main可执行程序的操作:
1、执行gcc main.c -L. -ltest -o main
2、执行ls将发现当前目录下多了一个main可执行文件。
3、执行ldd main来打印main可执行文件的动态库依赖关系表。
     如果在打印出现的信息中,你发现有一行:libtest.so => not found
     则表明链接程序找不到我们的libtest.so文件哦,为什么呢?因为链接程序只寻找固定目录,例如/lib目录。如果我们的当前目录是诸如/home/yls/aaa/bbb/ccc这种目录,那么人家是不会主动了解到的。怎么办?

办法一:把libtest.so拷贝到链接程序的搜索路径目录下。
办法二:设置环境变量LD_LIBRARY_PATH,增加当前路径到该变量中。
看看现在LD_LIBRARY_PATH有什么内容吧?执行echo $LD_LIBRARY_PATH就打印出来。
配置环境变量的方法简单点就是:

LD_LIBRARY_PATH=LD_LIBRARY_PATH:"/home/yls/aaa/bbb/ccc";

export LD_LIBRARY_PATH
好了,再次执行ldd就有新发现了。
4、执行./main, OK,输出正常。

如此完成一次动态库建立和调用。