|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: ( T8 R, z# x, e7 z& _+ h! _9 m" y( w
' m* {* G( W9 d, b. z
#include <stdio.h>
% B* @1 c4 X; _. p* E8 }6 A0 a" y9 K/ j/ C) p* n6 }
void show()
* P% J" D% C4 h' J- ^{
2 K- k3 G: v3 I# `- Y- ^* z printf("Standard Object by gashero\n");
% a, ?( \8 U, g& O6 {& _0 r% y}
3 i; s$ Y. r2 f$ p+ l$ D( I E* d" Z
保存为myso.c文件,按照如下编译:
" e+ N+ H( G( O* {/ s
) V4 D8 g3 N% v5 p' ~3 N: ~$ gcc -fPIC -shared -o libmyso.so myso.c ! z( p: [4 }" v# n; L, L' j
; A: M# } `1 C7 |7 W, u/ P
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
& K3 E. a) z4 t3 s: B) L 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: # S' S( H+ [" a. H9 [, x: a% a
6 C. x3 A9 r+ k, |7 h#include <stdio.h>% c* \2 |! d8 y" V: t. ^7 q/ o
9 P$ {* s! x# a/ x; `5 z; Rint main()
& K1 Y' q0 e& K; {5 c{ 8 a3 Y: N+ C- w2 x& t
printf("Invoke my so\n"); 4 q, v( ^& ^; @% O6 N+ l9 a
show(); & r. z3 J' Y h6 ]" d
return 0; . t. p! K# N, E) e3 O' h# I7 e, n
}
. ?9 l$ W/ V6 ]. ?/ ?
* h8 Y o6 _# @保存为invoke.c,按照如下gcc开关编译:
6 p6 i- ?3 L$ t3 j7 O5 W; r! u* \
5 N' `" z* k, l% r! h9 _! Q9 C$ gcc -o test invoke.c ./libmyso.so
9 A2 E+ Q* q% ]& w. t k% x& b9 d! Z2 Q$ v$ s/ y- H/ i
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
; I7 x& r6 p' `8 G
2 M' a: U+ ~, F5 _测试输出结果如下: $ T6 I/ x, u8 j" \" r- F6 e
& |6 }# n' [- B( R+ }
$ ./test
& h! J# B& O0 e9 k
6 U( b" M5 y/ ?5 QInvoke my so 6 q9 u6 p+ X+ N# _5 z+ i
" K) y9 f$ u5 j9 P, I8 X8 k* rStandard Object by gashero |
|