|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
+ ?; v r) Y' o" _1 m0 J, L7 E3 \* r3 ^; [
#include <stdio.h>
0 c, u s8 Y0 w: {' P6 w" |" q4 h
$ v& T4 Z, W8 g" \' `: k! m& F$ bvoid show() & y7 P2 s y; b
{
* ~0 g* D9 B/ D! ] r8 w printf("Standard Object by gashero\n"); ; Y# T1 w3 H" O% Y0 T* p3 a
}
4 R& t8 Y) S9 K5 n; \( g5 A6 }' ~! k
保存为myso.c文件,按照如下编译: 7 g, P5 m% ~" h P# K
! b* t2 V# O/ ]; K- f
$ gcc -fPIC -shared -o libmyso.so myso.c
3 {! e. _2 E" T/ f
8 i( A4 C% V; ~9 K 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
! c. H( G1 s$ p, A0 @ 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
( Z% d* b# Q) s/ i# @# z5 H
! ~+ q8 C! N( ^5 Q#include <stdio.h>8 P0 o. P( H& K! ~
5 ?. X5 ~+ H3 }1 gint main() + u- S* v( ~6 F0 B2 G; H/ u$ n& R
{ / V6 G: y. D0 z7 J3 \3 r x
printf("Invoke my so\n");
+ h/ X! z' d+ H8 h" ` show(); 6 B0 I. y4 Z' J; n& Y( u
return 0; 4 ^+ c- b+ n, P. D7 W, S8 m9 t) c
}
+ `1 p/ j' Y: J% Z. k3 I. g( `0 \" A- L! L% H2 ]$ A
保存为invoke.c,按照如下gcc开关编译:
% G$ d1 n' e" M6 e* p& ], L6 C
% U7 R$ P: N% m$ gcc -o test invoke.c ./libmyso.so 8 k8 k A, l4 \1 |
, G' E1 x2 B: y/ S- \8 {7 F 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 4 y8 V) c8 G% a+ E! n
" U/ v0 M; a2 J: H! D, a: R测试输出结果如下: ^) F9 q3 R5 @5 S, U. J
, \* Y- ]' {* l1 s( T4 m+ n$ ./test : P) r# j( [1 X- f( I* m! q
, s+ v5 L5 }3 ]0 S+ F( Z
Invoke my so 9 j& G6 f# l! ~ |
$ V$ `8 s8 j7 T, U5 g. |6 {3 FStandard Object by gashero |
|