动态库*.so在linux下用c和c
编程时经常需要使用。
1、动态库的编译
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:
libtest.so。
------------so_test.h--------------
void test_a();
void test_b();
void test_c();
--------------test_a.c---------------
#include
#include
void test_a()
{
printf("this is in test_a...
");
}
--------------test_b.c---------------
#include
#include
void test_b()
{
printf("this is in test_b...
");
}
---------------test_a.c--------------
#include
#include
void test_c()
{
printf("this is in test_c...
");
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c
-fPIC -shared -o libtest.so
然后需要安装动态链接库才能使用,见5
2、动态库的链接
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
---------------test.c---------------
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o
test
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
这只是一种临时的解决方案,
在没有权限或临时需要的时候使用.
4)向下兼容库版本的方法:如果程序需要的库文件比系统目前存在的村文件版本低,可以做一个链接
比如:
error while loading shared
libraries: libncurses.so.4: cannot open shared
object file: No such file or
directory
#ls /usr/lib/libncu*
/usr/lib/libncurses.a
/usr/lib/libncurses.so.5
/usr/lib/libncurses.so
/usr/lib/libncurses.so.5.3
可见虽然没有libncurses.so.4,但有libncurses.so.5,是可以向下兼容的
建一个链接就好了
#ln -s /usr/lib/libncurses.so.5.3
/usr/lib/libncurses.so.4