|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
' v9 Y5 U& D% {2 V8 a
1 n4 _# Q. G1 ^: B* D: {* `#include <stdio.h>+ b) Q4 _( Q& N8 |
( R1 Y, d& i# \1 Evoid show() 7 _+ }& N f3 P. H6 |( ^
{ 3 K5 Z4 ^, m9 { P. @/ U
printf("Standard Object by gashero\n"); 8 ~. t* U! @, v4 j' @* ^/ s
} - X- g; D: C& M
! V! M- H9 ]: o6 Q, g3 |, `# Z3 s保存为myso.c文件,按照如下编译: ~; U0 B4 {1 D% x( \2 ]6 P& ?
1 p8 s# W9 n l( }. R5 N9 T3 q3 Z% v
$ gcc -fPIC -shared -o libmyso.so myso.c
4 N9 S4 c: v3 ]& A
# G5 T: y0 @1 h6 r( j- T: |- s 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
: [/ T: L5 M! b' L- M+ J* \5 `% J 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: + c6 l9 k9 s- C U6 @: s+ B
' Z2 {5 q& J* H# O5 ^/ U/ l
#include <stdio.h>
; a4 E: h: N% j1 S' j0 M5 p8 f! A7 Q. U7 U6 a
int main()
6 y* ?( C& H$ f% y% [* ^0 z{ 1 w. m8 z C- F; X( v1 \' b
printf("Invoke my so\n"); 1 B: x W) |! \3 G
show();
& z! u& v% ^6 g( ^8 j return 0; & x! s) }5 h& j: w2 l
}
1 Y" F1 S4 q5 z+ r. \5 J# u
' _! I z z+ ~' r) [保存为invoke.c,按照如下gcc开关编译: + x8 c$ `& j a1 G# z Y- j! y0 F9 `
: P8 j" x& Y" _1 i5 m$ gcc -o test invoke.c ./libmyso.so
$ P0 I9 o. M: q0 H) |9 i
7 O+ n: B1 f" i9 Z 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 ; Z w1 W4 @, J: c' ^, j/ C6 B
$ z' r' x/ ?% a) G8 s
测试输出结果如下: ; G+ Q+ ~+ o& L3 k
5 m( B/ ^( R/ B0 J4 A* @$ ./test
7 y" O* X& L$ c0 Y1 ]) ~* z
; \8 L2 B* [% j yInvoke my so / `4 `- s/ f0 ^# Y
9 ~6 V* m, y, S. LStandard Object by gashero |
|