您的位置:首页 > 运维架构 > Linux

Linux下编写简单的动态链接库

2011-11-03 02:16 344 查看
作者:Let it Be 来源:博客园 发布时间:2011-10-24 10:57 阅读:5 次 原文链接 [收藏]

(1)Linux下编写动态链接库。通常静态链接库是编译的时候和源文件一起编译生成可执行文件的。动态链接库则不是,它是一个已经编译好的文件(静态则不是),只有当程序运行的时候(但是编译的时候要将动态链接库的信息加载进来),它才去找动态链接库拿它想用的一些函数。而且动态链接库可以提高通用性,编写一个动态链接库可以让很多人一起用。有点类似类?

test_so.h

01
#ifndef _TEST_SO_H
02
#define _TEST_SO_H
03
04
#include <stdio.h>
05
#include <stdlib.h>
06
07
void
test_a();
08
void
test_b();
09
void
test_c();
10
11
#endif
test_a.c

1
#include "test_so.h"
2
3
void
test_a()
4
{
5
printf
(
"this is test_a()\n"
);
6
}
test_b.c

1
<span style=
"font-size: 13px;"
>#include
"test_so.h"
</span>
1
<span style=
"font-size: 13px;"
>
void

test_b()
2
{
3
printf
(
"this is test_b()\n"
);
4
}</span>
test_c.c

1
#include "test_so.h"
2
void
test_c()
3
{
4
printf
(
"this is test_c()\n"
);
5
}
  

然后将这些文件编译为动态链接库gcc test_a.c test_b.c test_c.c --shared -fPIC -o libtest.so,则生成libtest.so文件(它已经编译好了),和普通可执行程序不同,它并没有main()。

在看如何调用它

编写test.c

1
#include "test_so.h"
2
3
int
main(
void
)
4
{
5
test_a();
6
test_b();
7
test_c();
8
return

0;
9
}
gcc test.c -L . -ltest -o test ((-L .)表示动态链接库在本目录, (-ltest)表示动态链接库的名字为lib(test).so)。

然后通过ldd ./test查看有哪些动态链接库和可执行程序有关联。

结果发现libtest.so没有关联。

运行./test出现:

./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

也就是说找不到这个动态链接库,但是我们已经在编译test.c的时候加入路径了?

这时候修改LD_LIBRARY_PATH变量

1
#vim ~/.bashrc
2
添加:
3
LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/xxx/Test
4
export LD_LIBRARY_PATH
5
退出以后
6
#source ~/.bashrc
或者/etc/ld.so.conf添加动态链接库的路径。

view source

print?

1
#vim /etc/ld.so.conf
2
添加一行:/home/xxx/Test
3
然后刷新一把
4
#/sbin/ldconfig -v
5
再编译执行成功。
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: