|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 5 R {/ H5 i) Z
& ]9 y( l& j, r( @
#include <stdio.h>
. Q- Q, l: H8 @: `' Q `0 f2 a% U/ q7 ]' S2 X# E, C
void show() 0 g7 d( K- i% k' R# J
{ , m( n0 u" I$ {# H: W$ s
printf("Standard Object by gashero\n"); . i. z j* `& }; l2 O& R+ Q
} + @" Q2 {2 U8 R0 ]
* M$ E- V; z# { h% }
保存为myso.c文件,按照如下编译: 9 T- r( w6 V, e; U' V$ R9 L# x
8 q6 |8 Q% P+ D; @' ]0 e$ gcc -fPIC -shared -o libmyso.so myso.c + v8 h2 k- C: J q* ]& P1 I& V9 @
" A6 }: z( ^8 D* j1 t0 K6 Y 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
, ~8 K2 d7 X' h- P, g0 Y& A 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: / L* M1 I- z Q
; C6 S0 c3 T+ B; n
#include <stdio.h>
) `; F: l U3 E: \; Q
, X `) f! X! n/ W( S2 b, Pint main() 4 ~9 ?. }5 U8 L% Z! A/ A
{
2 [ p4 g8 @2 y! i, x3 T printf("Invoke my so\n"); 7 [$ m( g9 M+ J6 Q
show(); ( r/ v; d& ]* p8 D; J
return 0; & o5 P# ?9 d6 O, O( k$ |* ~
} & l( N) k& x3 k0 }7 c2 |* T: |7 e
0 P# o# Q k6 B7 H# [
保存为invoke.c,按照如下gcc开关编译: 4 Y- W( U$ ^" v' q( c; ?8 N7 m& x: o
0 L% `3 w4 m5 S$ gcc -o test invoke.c ./libmyso.so
- ^9 \) G" ]9 _% ~( t$ [* H7 D9 J3 k
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 - q; r9 b4 L( O& C) c8 q/ I$ Z8 P
, l4 n- w1 [1 N% q) I/ A6 l& _测试输出结果如下:
' S8 x: ]+ x5 x. R; H) O4 W
: B* U) |! l0 t% ~* H- ]! z5 o r$ ./test 1 s0 J6 a. ?5 r
8 N/ x+ y. ], ^6 _( W
Invoke my so
6 E0 D2 E0 ~8 e x- |) M: k
: V; N* q) \- w* @Standard Object by gashero |
|