|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: , `3 c% r) d: |7 _ b
0 O: X) s/ g% `1 J( u#include <stdio.h>
% D* `) {1 C- `: Q' \
' |0 a7 F( ~3 V; o1 v. |* ^# ?. Bvoid show() / c c$ {/ g; A: R1 `6 o; X5 \$ [
{ ) g" Y2 ?; g9 M% R/ L- Z; P0 q
printf("Standard Object by gashero\n"); ( [1 ?* O8 {0 N. H$ }0 V/ i$ M$ ]
} / c6 Z, O9 w. s4 f" _% D7 j
/ q+ K r" o; @4 M& L, m
保存为myso.c文件,按照如下编译: % Z7 j& R# O' N: K
+ ~" g; n4 s! i+ r# @
$ gcc -fPIC -shared -o libmyso.so myso.c - R6 T) A6 j, B" c( |3 K
! k; Q. A0 J: t4 {( |% q2 P
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
: I7 a! h6 j/ |) |" I1 W( P 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
( k, [+ N' h1 L- d! @% O4 O# I+ _# _* p4 H& |# k2 a
#include <stdio.h>+ o) u' q' Z5 a' x
. D" }' U# S4 c1 E0 \* F# w) j
int main() c! D1 g! x v1 |/ f7 |, O
{
3 G( y9 }: k) t/ m! s printf("Invoke my so\n");
% e: _) C0 n: N0 G show();
5 Z. `: p3 k9 u2 J return 0;
/ w v, ?# q6 m" ^}
! x: h L' e- Y: z7 E$ y9 V
- K5 b( d8 K5 I/ f" B1 o; c8 w保存为invoke.c,按照如下gcc开关编译: / G9 I8 K( P4 E0 N+ ?" {/ B# P5 |5 @
1 C5 V0 x [- j% I- I/ Y( r) U6 ~$ gcc -o test invoke.c ./libmyso.so 2 q6 U, D1 @& Z7 n6 F1 m: X
' S* E Q/ \8 b; @
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
+ H7 m5 K! y2 i: C; u( M' m8 s; W0 U9 i0 Z; t5 r7 H% e R& |" q" s
测试输出结果如下:
5 a1 R8 e( K/ Q0 K2 w$ t( C
' Z2 X" F. b# H4 ~$ ./test
; ?+ I" n1 V% O- J! V: {
7 a4 `8 I4 {/ B8 \2 r$ A8 LInvoke my so
! e; l) O7 E* V t" b9 v4 G7 ` K8 p
Standard Object by gashero |
|