|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
0 M3 ^4 k7 K8 _8 q5 _5 i( R+ M2 B% r! d
2 E( _+ n c6 t4 {2 n- B" j3 }#include <stdio.h>
; m" X0 L! M# n+ ^9 ~4 v3 T+ [) N: V' U& c! l7 m" K+ p' v
void show() " H* n: T4 [5 X7 @8 ~ `; P
{
) Y& W; e- I& G printf("Standard Object by gashero\n");
9 ^6 @) p( O" n {, L E { w}
- M6 B, p* n& o5 `3 C) \
+ }* U, V8 a* v1 I; E保存为myso.c文件,按照如下编译: - c* L P) q3 h( R+ `
5 d- g" L+ ~: a. R7 d" `) i/ N7 u
$ gcc -fPIC -shared -o libmyso.so myso.c
1 x- h8 I1 Z) m& N" O8 E. U. j
: u, m1 s- O A) ~ 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 2 B9 w4 E; ^0 E; u/ x* b0 R
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: # @. z3 N! Q a) P( h" h- q
x* l- P, {' d1 m#include <stdio.h>8 {' |2 G3 v; i- }" b
& |, Z; p; s+ E! x. j4 Rint main()
5 Y+ v& L( `& G{ ; M. J( f5 [# V0 P! ?$ j" j; m
printf("Invoke my so\n"); 7 |! [* n( j0 g- V x. s" i
show(); 7 a0 G, a) t! ^+ n
return 0; , H: s' N7 N" a
} & n* t& B6 t& m. x& T( t
( a0 o+ C) G5 L5 \( |. E( q4 o8 O保存为invoke.c,按照如下gcc开关编译: " @" v' m) @$ @/ |8 D4 l
! z3 N0 A: d% M5 Q* l
$ gcc -o test invoke.c ./libmyso.so
* h, W7 R; m0 {% m( L/ L& e* O" u0 N; A }0 q2 J. G4 x& z
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 6 d* w- N6 Z8 A* x
+ M! g( V( S1 e' C8 A5 p1 U/ ]/ B( i# O测试输出结果如下:
2 a5 v$ C8 G* C- |" F3 F# ~
7 @# D. }& j% Q# ~7 C( P& l" n" y B$ ./test
# N( e2 M3 V0 F Q$ V% U9 i$ M5 ^8 u! ^7 P
Invoke my so ; w8 a! }5 k# P/ d! q; F
8 \9 [! O0 _' ]7 x/ _, z% k6 ~Standard Object by gashero |
|