|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 9 B9 L. n/ K% ?# I, e1 O8 y4 I! d
; r9 b% J, r7 n7 I. |0 J( V#include <stdio.h>
; }- U# m* E- O: h/ U# {" ?8 ]0 M3 T9 \5 `, N ^
void show() ! x9 P) _5 x" M. r( c
{
; S d. W/ M7 d- s2 N j ` printf("Standard Object by gashero\n"); + r% |( D) }* N9 m$ M0 z
} ( t8 p, K( h8 {+ k, I8 M% g
2 I" R4 k* D! |- k7 t0 q* f保存为myso.c文件,按照如下编译:
9 ~& P# P4 ^- q% F7 {3 |3 @+ X; ~
$ gcc -fPIC -shared -o libmyso.so myso.c ' Z0 F$ @# V* l
1 L. _6 y' m2 C
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
( w2 J4 y: a& i4 y% U5 `! K$ ^5 i" h 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: . _, F; {+ d. _* ?
+ f7 L& d! _/ f* \3 i8 V#include <stdio.h>
' y0 V' M# v* D' Z( b4 g) j. N: x" F' i
int main()
5 ^4 a5 L* `# v3 B/ n* \{
' k& s0 }( F; u0 u& l: z printf("Invoke my so\n"); ) K! h8 `2 h0 F. G5 [7 I& U/ O
show();
! m$ r$ P2 @6 z& T3 _* S return 0;
) T7 ?; z; J% T& R0 L}
/ ~' z0 R$ l& H( W6 }9 F3 Z0 ?
/ z5 k: \) q6 e5 X+ W B2 |8 N; U' h保存为invoke.c,按照如下gcc开关编译:
% I6 C/ ]3 W- k& l) q" b/ p) o, A! I
$ gcc -o test invoke.c ./libmyso.so
) b) w9 S9 J0 p# U5 ~& M F2 T) Q f5 P7 U' F
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 ) f& i6 I/ X1 B3 n* h
) Y! j' K6 z" s
测试输出结果如下: # M @3 G7 J4 Y7 w
$ F d! q; C- _0 p1 M
$ ./test
/ J4 A+ e) Z( k: |* ?( q z" P, C0 J m# t6 f0 z
Invoke my so N- C9 J# c; P; q, X
- H; y, k6 n0 W! G. q' y% g& z
Standard Object by gashero |
|