|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
: x8 K) I4 v; k1 l% x0 d
! \4 Z% C5 b; u#include <stdio.h>: b$ l) a8 J" e1 F; d
; Y# A& }& P- q) evoid show()
: B$ w4 K, |" k9 o2 ]% r& U{
& e: K+ C; ~! D printf("Standard Object by gashero\n");
9 r1 |+ b, |. n( u" Z# O1 ~} 4 V( I. V7 [- M4 v
+ p: p: u4 n* i
保存为myso.c文件,按照如下编译:
8 ?" ^& p0 t1 }; F( r/ m
! y+ o) l5 G3 {$ gcc -fPIC -shared -o libmyso.so myso.c ' z0 h# v, v0 b* F5 O: O1 a
5 a; P5 c/ `5 D* ?! e L; z$ T; m3 ]
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 ) n$ q; D+ u j- {4 Y
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
2 `: ^+ g4 t7 b
7 L1 A4 E( e) |% z! [# W#include <stdio.h>) @% k& E5 C# B$ j: f
& @3 c0 {! V" k' Sint main()
+ c2 X7 Y8 f8 e, Y, w{
* c/ i& \' L5 u% B: p$ B' P) e, _ printf("Invoke my so\n"); # g4 s D7 [, a1 m# q
show(); ' S3 v9 d9 E8 W5 a
return 0; # h( K! K5 R; H4 s: s3 k
} 6 H6 }+ Z. `' p. S# W4 \8 u) r/ j
6 p, Y, q: w" I7 f- q保存为invoke.c,按照如下gcc开关编译: & I0 {! Z% C$ |0 d6 B
4 S* L P" C1 P0 Q
$ gcc -o test invoke.c ./libmyso.so
0 F; @- c* l) w5 P4 f- t% A3 `: q4 a5 ?
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
2 a, [5 i. q# |2 E6 n
# V0 o4 E) r# I0 M) a0 s9 `测试输出结果如下:
1 e) d+ ~! |8 k% h- |
1 K, J. u* L, j* @% q c' F, c) r l$ ./test
3 X" M9 i+ B9 C5 h
% U, o3 a7 l) Q: l, YInvoke my so 1 @- M! ]' s6 H- A
1 k. m& M; {+ ^6 i2 ZStandard Object by gashero |
|