|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: $ F$ S) H2 w1 W. }4 }
* Y6 a# ?7 T% o/ ~3 e5 D* j6 b#include <stdio.h>
! t1 G* H6 F/ c* ], O5 {% J9 J5 V# t, b% A5 {
void show()
) C: i& m1 E+ ], b{
: p8 y" Y/ y1 H+ H printf("Standard Object by gashero\n");
) b8 Z& ]9 A7 E$ k4 Y} a5 S9 A; `4 F4 M: S2 V7 ?+ u
V. n/ C5 \: e
保存为myso.c文件,按照如下编译: / r2 B# {1 P* t, K
/ ?+ o2 l( a1 o5 o$ gcc -fPIC -shared -o libmyso.so myso.c
! ?( V3 |9 ^ e& _( z) P3 `; K4 ~& n* d9 R. n
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
5 p- K; x- t# X 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
; s; X( u+ O7 s7 D$ E4 y& m& \( ?% A; t1 \8 ?
#include <stdio.h>* b7 Y. ?8 r a7 e" P( t
" M4 h5 y8 a9 l0 f# D$ Uint main()
+ w# U0 y: r2 z' |- T; R2 J{
( m8 _, |9 O( ~; } printf("Invoke my so\n"); + I5 V: I# s4 h D: p1 v
show(); # Z; [* b# A3 w6 x
return 0; 3 G3 ]0 n' [, z( N ~) O: b
}
8 d# ^1 H g8 J5 I9 d5 B, W) {1 C
. I& j7 `- p+ D, a保存为invoke.c,按照如下gcc开关编译:
% O+ a* u! C' r! ?4 D9 h- _# P- H" }$ Y* d5 l ]
$ gcc -o test invoke.c ./libmyso.so
6 x# A# A: r+ y( g; \; o9 a' r" K* M% N. C. M9 Z5 b$ t0 n! H* W8 {1 a
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
( \# H' _3 _8 y3 E" m' h
; E/ s, W' M. C% f' M8 X测试输出结果如下: / f3 s( ?6 b5 B- X/ Z
, ~( j2 o# R, _8 u) z
$ ./test
2 j2 a2 N* c, v/ Q) F( h
. d9 }9 E) E4 z) ~5 `! ?Invoke my so
9 U9 \6 i" j4 A. N2 F$ w' ?
1 X" O% F# o& rStandard Object by gashero |
|