|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
+ |: z3 o" \+ P2 ]& ^- F: Q/ V% j) D: {
#include <stdio.h>+ f/ | E2 ?, o3 |; p8 w& X; N
A6 ^7 i8 S6 W" n4 E7 |
void show()
; b7 t8 T; P4 X, N1 a5 v' b{
' [( J4 i. S+ [ printf("Standard Object by gashero\n"); 5 I2 P5 \ X3 Y: c. q7 C+ y! q
} / K- ]; G# i8 @% H8 v$ b* j
1 H9 c$ z2 P' h- H/ L! O1 V3 ?# T
保存为myso.c文件,按照如下编译:
* S8 f2 W# z5 c# x5 U4 o x9 t- _+ v! I
$ gcc -fPIC -shared -o libmyso.so myso.c ' d8 x) U) {( k; W- t6 H
7 W' t) t, @& d; Y
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
$ C0 F# P# y$ K# E 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: : G2 g( F) b5 W8 Z
* M1 \& W n1 E O& U, v" l& U
#include <stdio.h>
) v$ h# B! c* m; J: ~) X- v7 W
! n0 m J8 X4 m0 T" [1 V4 l$ |3 N3 }int main()
7 O( P; u4 h. H9 ]{
6 g3 P8 h* {, I) Q- @9 G3 L9 g' x( T printf("Invoke my so\n");
2 q$ y5 A1 [' L6 s. i show(); ( w, r" x; [* v8 O4 k
return 0; ' }6 G7 U q6 W
} . R+ ?8 H* p& B) O: L
- I8 i/ ^0 @0 A1 C+ Z保存为invoke.c,按照如下gcc开关编译:
) d2 z! z3 s. b1 m. X5 X/ m# v
6 k$ s+ u2 y8 Q3 ?# O. z0 r$ gcc -o test invoke.c ./libmyso.so
9 k4 l+ W- ~& V* Y: U+ q
. m& p" m+ n5 M: o$ X; ^ 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
: s2 ^) E( f/ _6 F E4 E: l+ `2 S; D7 z) E6 t" n
测试输出结果如下: 4 ^& G: L# ]( c% ~+ r4 x
3 N8 E1 e; n* W9 w: P+ m9 q; [$ ./test
% j$ S0 ]0 G- m7 u' m0 A$ M5 ?# U. B4 q4 \! I" W ^
Invoke my so 2 s7 ~( w0 s! M1 t' W
& H) c5 A9 z" e T3 D( |
Standard Object by gashero |
|