|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
! Z O8 E. a9 Q& J/ w+ V
6 ^5 E% N7 D; m#include <stdio.h>3 w& N5 V3 a# F, O
& V; p- R/ K3 dvoid show()
x$ A5 j. p8 n/ A; j% {" o6 J8 G{
8 `6 m- y$ G( c6 v printf("Standard Object by gashero\n");
) E! J2 Z0 L" M* ]" r0 P}
" E9 @# o# A( V$ O
7 L( q9 g% k) o' |9 t6 }保存为myso.c文件,按照如下编译: $ q1 j) R1 k6 C5 `- o0 w2 p
9 f6 v; P' \" e/ {2 j: U
$ gcc -fPIC -shared -o libmyso.so myso.c
7 X+ M$ ~! J7 P& b% m* T
! b$ B/ M& Q' i+ A% e1 n& s 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 . d# s& R$ ?% G$ U% p4 z/ h
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
, r2 I1 K& b. x$ t* W5 D3 H- s0 L7 M0 i) m3 N- F4 q& S( ~# q+ j6 I
#include <stdio.h>) A3 T# n$ q4 t4 D" i0 |* ]
( t3 ^: ~5 t) D7 g
int main() % ^; c& _& Y+ T' m& r4 F
{
s# }7 D9 j, ] printf("Invoke my so\n"); ) I; Y% w# [9 ]. D; u
show(); 4 U" a" T' c: U9 N4 R$ G. T
return 0; * l2 p% i' B/ b- U: s
}
( l- Z: y- S' i( p, ? T. B& U* M9 j) W$ L
保存为invoke.c,按照如下gcc开关编译: * h. \& n4 I# d. J6 c0 s1 G2 v+ }
y; }- M' u: y% ]: a) q5 c
$ gcc -o test invoke.c ./libmyso.so 0 s4 z& l* I6 p g6 F, {) X
7 T5 M* G0 v8 o8 K3 {, X# L 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
& F Y# f1 j$ g' d5 m- P$ M0 l; s5 Q
& r, H4 r5 A+ d4 s) c }测试输出结果如下:
5 w: A& Q$ o0 I: F7 j+ H- K! H. C8 S5 e j6 R$ b
$ ./test
* ?" a5 P/ _# S1 Z
8 W- }4 O) w" M+ [0 ^Invoke my so
8 ]" _1 {7 d3 i7 S8 k7 I) F1 \1 j! c5 C3 W- z4 }
Standard Object by gashero |
|