|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: u: n$ f& z7 E! {2 e3 J' N9 f
, \" I: M) o7 l+ _. C* K4 s
#include <stdio.h>
* F0 m2 M3 C' ?7 F" G3 R- ^( C# ?$ o3 L# C- x* M2 `5 p
void show()
h. t9 m) d1 D( b" {! h{
+ W0 I" ?$ m7 H# S- ^- Q. O printf("Standard Object by gashero\n");
) d/ ~* e2 A/ Q/ k}
, A1 a( C0 l5 e
7 B$ G" D2 }6 V+ S保存为myso.c文件,按照如下编译: % s @$ h& U. B! Z+ ^' h9 u0 \8 m
4 \! z! I. Q2 `& N+ N8 T2 W4 t
$ gcc -fPIC -shared -o libmyso.so myso.c
+ U! M, e+ m% y" J$ v
- D; O! r9 N& i ^ 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
) s2 {4 M9 W# {9 S5 \6 O 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
, f7 O" V" n8 I { v" h6 X O% t- X, d3 n2 O4 s
#include <stdio.h>
/ o) \; v) t4 ]5 J; o( t( Y* ~4 l) L
int main()
) S. a$ G8 J/ R% m{ 2 B3 \4 J$ u+ U/ z
printf("Invoke my so\n");
; t# m2 h) O9 Q3 j& S4 c show(); 1 V( f, t/ T3 ~: W2 m- h/ c
return 0; 9 G5 v9 S8 b5 x- H- c+ i
}
$ z" a/ p5 W5 U% }1 h
1 W% F" B' q' t1 S3 V9 x保存为invoke.c,按照如下gcc开关编译: 1 K& }% m" P1 G- _9 m& J$ B3 x
7 ^, ^8 O) B) V* a- l
$ gcc -o test invoke.c ./libmyso.so & I! ~4 w3 e& z) D2 r* F
% L) t; q7 }$ X3 Z7 A. | 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 / P" Z/ D* L% y$ S7 M* I. V: r3 \
- K I/ D3 V1 t, \. \4 @测试输出结果如下: " O# q; r5 E# j
K7 k4 h+ P% ^
$ ./test 2 |# _7 F) S, w4 s1 E6 u
. H2 P5 X3 O) d* }) j" N. v! F+ R
Invoke my so + T j, f6 J' r! ^" ^, K
% m+ z7 f B( b4 `' r8 nStandard Object by gashero |
|