|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 6 w8 K3 J. @5 N+ [; M
! A$ W) T. E# A0 D; x, m; W1 ?
#include <stdio.h>7 X1 \, _& `& S" R
4 } U5 }) e I/ P5 `" q1 f/ p2 F3 @
void show() - U5 h2 L+ d0 M T
{ 4 ^( A0 Q$ }" x2 O: n9 l) t
printf("Standard Object by gashero\n"); 8 i( g2 d6 b ~5 | t
}
& L: Y/ R: ]. @- @/ G6 b! A" ?' k
* B5 H" Q N) [保存为myso.c文件,按照如下编译: # C# c6 ^4 t* s5 d* s: l9 L
+ I5 G( T: Z9 W: U! P, O, F
$ gcc -fPIC -shared -o libmyso.so myso.c 9 K6 i4 Z% _ j1 X d8 k$ P
! j7 \) j, k5 U 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 & Z, @/ p9 t q" S$ i
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
3 v5 D. ^) A" b7 }- u: x5 j. G1 j+ u7 x
#include <stdio.h>7 Z' o# g! D( ~. o4 f
2 I5 K8 A) K& d) v" c$ L8 J- tint main()
2 S; ~" a1 s. e5 N6 V{
9 Z1 g4 o6 l F5 ?# z6 Y/ g printf("Invoke my so\n");
9 J. C% S: d2 V( U show(); - I& b; H: G" N- q
return 0; # K- {* B& k5 u/ \( P6 Q6 X' z: B+ P
}
6 P6 A" N- H3 g. B4 ?; q7 j5 k
3 [; N o6 C, m9 C) A保存为invoke.c,按照如下gcc开关编译:
% R# ]+ u' l9 ]2 C* L2 V
. `9 P8 x7 J: V4 B* T$ gcc -o test invoke.c ./libmyso.so
! a7 N+ i# h4 I$ t4 d/ `' q9 M% F: F {% L% L9 p
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 6 e- r% U! E" Q8 [$ Z4 _. R- F
# |1 `1 {8 i) X# R测试输出结果如下: 0 _5 r6 J5 m) b8 T1 q) G2 W2 t# `: R
6 ]5 M( U V' q5 U9 r
$ ./test " Z5 `5 L1 Y/ L, ~, k& g
0 O# {$ o9 x- |Invoke my so
& g' c* Z' H0 j1 O! j/ ^- [3 K9 ~. A4 V9 l
Standard Object by gashero |
|