|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 4 F! h* H% @7 Y8 v2 |; [5 y
1 B7 O1 Z- d+ S4 ~: E6 _. P# c }& K#include <stdio.h>* W/ S' G7 A. z6 L- v
' w5 X) [ U, T Q1 l4 I' ]# q+ ^void show() 1 E+ ?3 T% }/ h+ }. y+ I* D
{ - _) D w3 X: O( b- x/ A
printf("Standard Object by gashero\n");
9 B2 O1 [, {+ K; x) B} h3 C3 }3 D3 k# v/ E* ]8 h- M2 K. Y
% q; y& f1 o8 t9 C8 _+ F. e保存为myso.c文件,按照如下编译:
! _& I% D5 f# K* q2 C+ C' I p+ i9 f% K$ v1 D0 L
$ gcc -fPIC -shared -o libmyso.so myso.c - N; u- _1 }% M0 G9 I" ~3 M
9 k' u% b$ h* s1 [& \/ j$ P
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
8 K3 L% P* M! S: i* p) O* \/ t 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
. I* d2 N1 w- e/ o2 G! G b Z1 p( ]1 |8 P* x5 [6 I
#include <stdio.h>8 T4 K' U: ]0 I+ k# T- P B% E* d
( D6 [& |' ^7 V% Q# D, i# i, O
int main() 2 _# f& Q0 @7 V6 @
{
. E0 i3 O/ V6 q, d+ Z- P2 h printf("Invoke my so\n");
/ g8 u `# n3 S7 h show(); & O( m% G% k( D. H: [% W
return 0; 9 W( V$ g0 ~1 }8 z2 t' F( \
} : e/ ~6 t9 P z# V
. _' G8 \+ ^ @7 B( M7 [5 e0 H
保存为invoke.c,按照如下gcc开关编译:
) j! o" B8 K# m. [" \5 B: [$ I2 t) T' x7 _( a# o# t
$ gcc -o test invoke.c ./libmyso.so
6 A. m# q) s; v) Y
; Q. T0 k B3 I 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 5 \* t2 F; m3 U p
d- g1 ^$ ^9 O
测试输出结果如下:
$ M% E( s* d# u% `7 z# ^5 L6 E- G, `7 S; y7 G
$ ./test 7 ~' |# T, M) a
2 |$ J2 p2 z. T- kInvoke my so
# j8 b8 D, @' x i! m
/ z2 ^ I/ H/ Z' y# j( i, DStandard Object by gashero |
|