Linux动态库的创建与使用

来源:互联网 发布:windows dns 日志 编辑:程序博客网 时间:2024/05/20 22:40

以下是一个简单的例子:三个文件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 -fPIC -shared libtest.c -o libtest.so


以下是编译并生成main可执行程序的操作:

1、执行gcc main.c -o main -L . -ltest (-L指定编译时的链接路径)

2、执行ldd main来打印main可执行文件的动态库依赖关系表

3、运行main程序,正常打印run test() in libtest.so


编译参数解析:

-shared 该选项指定生成动态链接库(让链接器生成T类型的导出符号表,有时候也生成弱链接W类型的导出符号),不用该标志外部程序无法链接。

-fPIC      表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.          表示要链接的库在当前目录中。

-ltest     编译器查找动态链接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名。


当libtest.so不在动态链接库的搜索路径下时,运行ldd main命令,在显示的信息中,发现有一行:libtest.so => not found,表明链接程序找不到libtest.so文件。

办法一:把libtest.so拷贝到链接程序的搜索路径目录(/lib,/usr/lib)下。

办法二:打开/etc/profile,在文件最后添加export LD_LIBRARY_PATH="/home/mylib/:"$LD_LIBRARY_PATH,保存退出后,运行source /etc/profile命令。

办法三:打开/etc/ld.so.conf,在文件最后添加/home/mylib/,保存退出后,运行ldconfig命令。


原文整理自:http://hi.baidu.com/sunboy_2050/item/3ab94beed9d01ed9eb34c9cd

http://www.cppblog.com/toMyself/archive/2010/08/02/121971.html

http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html

原创粉丝点击