|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
- V$ Y' n3 ~2 |. K) B" O
6 B% s4 E3 p5 r4 s3 L' ~7 D- C1 ^* D#include <stdio.h>4 o3 t- L/ d" o, H2 \5 g0 r
5 X' h) x# `! w8 J; |void show()
% }; b) a. I1 h{
$ {* z& s5 F ~/ ^* u" o2 h printf("Standard Object by gashero\n"); . x3 O N$ `) C0 R& c
}
+ l. P: o0 i, n4 C5 W/ m" z, t# A
* L8 ~4 }* p# c, k保存为myso.c文件,按照如下编译: 2 }8 S6 m6 v7 c
% y7 F( S, p( U3 H8 m9 D) v( O7 x/ j! p
$ gcc -fPIC -shared -o libmyso.so myso.c
/ `) ~$ g' g. ~+ Y/ O
! S3 o2 G4 L2 A( X( i& l: N 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
$ L+ c. Z2 l" v- w2 ? 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
0 z. Y& S+ B& _0 L% u) k2 F% E; @. ]6 a" G
#include <stdio.h>0 r# |& [6 P4 B8 z7 x
: J! H6 N8 q& F3 `# r) yint main() + J* ~1 ^ @& b0 U
{ 7 s" Q C' g/ C9 t$ d8 t
printf("Invoke my so\n"); ; R2 X) j8 W3 s
show();
0 @/ Z6 \+ |; o2 g8 ~8 F1 ], j return 0; 1 V1 u. p$ j7 O L
} 7 ~0 B8 \" g, J8 N' U
# {2 g% Z$ U2 L9 T6 c
保存为invoke.c,按照如下gcc开关编译: ; v2 O/ D: n: o8 t' d# d% t m
2 B# `* k [6 w+ P& E! C6 q$ gcc -o test invoke.c ./libmyso.so
9 `& g8 O+ o2 J$ D/ ~
* U6 V, @+ v' }9 h, I 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
* {- T; ^6 ]) G" |5 n% D; V: D# N0 r! y4 ^
测试输出结果如下:
* ^8 a5 i9 U2 f: |- D! t/ q b
! b; H0 u6 L# P! s# I0 S g$ ./test ( N) o3 G1 W; n5 S& S/ _
4 ?, p- P$ [$ c5 C, u9 [
Invoke my so
: ?) x5 H; C. o4 y4 l3 a" |3 q0 v, h3 q0 e! x2 n# V. Q
Standard Object by gashero |
|