|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
/ L4 f. S0 B+ d
0 Y: [: H1 R# a( q# }#include <stdio.h>
]% @# g8 ^7 E9 d$ a& U, z! E; `. m5 C. C2 J; ` t
void show() 1 o: M# T _; f) l4 j- T
{
9 r' `+ v9 }6 J! \ printf("Standard Object by gashero\n"); 8 f! b6 U2 K/ z; H/ o7 Z) a
} ( A' x' Q' ?# z) ]% I0 E
& a# F! Z% l# X* z5 S% F
保存为myso.c文件,按照如下编译: + ]1 R$ r7 T& _/ T& f" n
% P) v* z) K" R$ gcc -fPIC -shared -o libmyso.so myso.c
: n& g! S" S) ~. Z+ i/ Q% s% b4 G* c, d N l" V2 Y
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
5 ]8 a* p2 ]: L/ k M 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
* Q) ^) Y/ {. ]8 t, q# j. [- p$ \3 A P* v% r' V7 g
#include <stdio.h>
5 r( e8 q/ Q4 O- n/ k
/ ^) U$ t- y7 ^( t8 E9 o" rint main()
1 R- U; \/ W1 k4 F{
) C! Y& G! |( J- ~ printf("Invoke my so\n"); E" i/ S& x7 I$ }6 E$ ]( [4 k
show(); 7 m& ^$ m+ f4 ~1 [
return 0;
/ X# Y* B6 q. J}
" }6 `: Z2 ~ a" v$ ]4 a8 V9 Q7 |! k% _8 w1 O, U
保存为invoke.c,按照如下gcc开关编译:
. w. ` K9 p0 g. {1 N3 S; J/ u
0 o. G, V, R$ ?8 D3 m$ gcc -o test invoke.c ./libmyso.so 0 h. V2 u$ a0 q2 P# ^& P/ f
, D* @/ M* q2 ]+ X$ A8 e 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
; G' N3 u3 p( K9 @' K' H
7 }% g% v# ]0 E; v9 N测试输出结果如下:
* J4 ]' h' s; ?! ~( j+ Y/ x. ]$ w9 v- J4 Z* X. V% v8 ^
$ ./test
- K+ _- l/ l. Q# T3 q
6 w- r( S- V# ~' E. w8 GInvoke my so
$ o: u E* Y! r( D
1 ^0 L7 n( o" c3 |2 oStandard Object by gashero |
|