|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: # v. b9 ?# d7 u8 s$ \6 k
6 I1 u0 x2 n/ D( y
#include <stdio.h>
: ^; A/ g- }$ z( H) ]3 R5 K' @0 C i; l9 }: K' k7 c
void show()
1 @: B' U0 p* o# I, x$ v{
- g Q% W% U! d7 J printf("Standard Object by gashero\n");
- H! E! C6 G% C3 J! W6 h}
w& x' ~) Z& z; z( w
$ ?3 P4 f0 g/ h; Y1 o保存为myso.c文件,按照如下编译: 7 n4 I8 M& s2 {: B" M, @
( B- O( l& r# M( W
$ gcc -fPIC -shared -o libmyso.so myso.c
* }" W' s3 _' [4 ` |2 f, G/ G: i; g4 i- L6 o' k8 {0 ]
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
. h: f# _; I" s* d3 Q5 G 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
+ M. N. g. J8 m+ y" n2 O3 i. w! }: W3 F3 C( V; U+ L
#include <stdio.h>
1 R w( z! \$ z( ?; [2 t( z! s" |6 R Q7 Y7 j" _$ F
int main()
+ u0 o( o8 \( G" P# ~. f{ 8 r0 p; D% B/ ?7 ]6 T6 X$ k; v
printf("Invoke my so\n");
& q+ z9 k( o6 x) W, M2 K show(); ( q+ V, O# _& ?" ]
return 0; 4 [3 [6 v# S" X9 z H% @( }
} + z1 B1 w$ y5 \3 S2 c, d/ A' k
9 p9 p7 |9 v" w; `, p3 t* v
保存为invoke.c,按照如下gcc开关编译:
6 [# U9 p3 j; c' Z+ F! z7 R& s
$ }8 V7 d( t1 b$ ?) e, T$ gcc -o test invoke.c ./libmyso.so 6 Y$ Y) x+ d" p! _
4 A( m1 ]; X A) x 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
- R& s+ q& J4 U- ?( V3 T
/ m9 L* C( q9 M( e7 _3 a测试输出结果如下:
! N& k3 D1 M* F& J1 {5 M y
3 H3 J, t6 |0 y, i7 y0 U; j. V$ ./test * N' S$ z7 \# ], ]' r) `8 x* Z
: i+ Z4 H& } g( D
Invoke my so
+ w7 s3 f r4 n0 p0 {1 s4 c; m( O, B; T" k
Standard Object by gashero |
|