|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 1 ~% i$ {9 U8 U( \+ a( ]
+ r( I: a a, @5 |* |* q; |
#include <stdio.h>6 N* _! W: W6 h' F
6 W% V" n! c4 h9 X! e0 ~void show()
* _7 t' A7 m2 ^8 D{ 6 a1 M0 v6 w @
printf("Standard Object by gashero\n"); 2 s9 f( f S& |5 `( b& D: o& z1 H
} 2 o, ] J m- e! W S
# P; _; [ H- f保存为myso.c文件,按照如下编译:
8 k4 L8 l( [. {. w/ I4 ]/ P$ U# g6 _2 a! i6 |2 f
$ gcc -fPIC -shared -o libmyso.so myso.c W" s( x8 I2 T
: t8 I( o5 r- [ w( u3 O
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
5 z$ ] _6 ?' i6 s; X; ^ 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: 0 n: T2 w. Q2 J+ G
' ]4 T* f% n/ C, o
#include <stdio.h>/ O6 T9 ?% K# G0 X0 p
0 y. X% I: X2 z& s
int main()
7 b8 k" A/ L" ` p8 m$ x{ 4 _+ i( q1 p; z9 ]
printf("Invoke my so\n"); 2 e4 w& K: E' e
show();
/ [4 q7 N- G M& d: D return 0; * R' B& [0 \% b/ {
}
$ s$ _( c0 R8 |: X" L' m, |8 ?; J( a, J: g2 S1 l% b
保存为invoke.c,按照如下gcc开关编译: 1 @. {% v5 f7 h% W
4 X% ?! [) {- S. ^" m$ gcc -o test invoke.c ./libmyso.so $ _; g t. M1 t3 \! |
, ^& [- d7 q' L# l2 T 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
d, R6 x8 V( o: i3 Y* C
. X1 y+ l1 R2 j Z7 P7 Q测试输出结果如下:
/ r3 L# m9 `4 A+ C2 z9 h4 v. A& u/ K' @, G" E! l9 l) u! j
$ ./test
7 \- M# i, D! G, q" B' v/ H
" l9 R9 \, e! h! d2 {; FInvoke my so - e# D6 a% M9 Z8 W n8 C |$ f# X
4 G' E$ {, ~' R7 ~# e
Standard Object by gashero |
|