|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 7 L* t; I3 v# c1 S. T
" `1 n" h& {4 X9 F3 C' X#include <stdio.h>1 S5 Y- @; H: C: s
" t8 O6 j, \" `
void show()
8 Q; ?) ^8 t+ @{ 0 A. m( [' _0 e3 i: g4 T, p
printf("Standard Object by gashero\n"); 9 e0 j L9 `( l& S
}
$ w& s1 ^$ ]( s. _3 w/ Z# u) H+ e# k6 s0 C6 ^* e. m5 C
保存为myso.c文件,按照如下编译: / E1 I% S' y& q* m
6 h9 D2 c9 d9 r" x: o" e$ gcc -fPIC -shared -o libmyso.so myso.c
5 n0 v* [/ F& H6 ?: {
! P2 B9 d p: x( b% J% s 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 / B7 Z. G! C Q# W( v6 @
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: , w, a: V. P* p; B1 q. r! X
" p: ]! q! `! ?/ I! l
#include <stdio.h>
5 e+ H0 R* k. V$ D. `# B0 V) _ M- _ w
int main() , ]5 B* V0 g9 x/ M a# y
{ 0 Q- W9 B* i; c0 S
printf("Invoke my so\n"); 8 q9 o( B2 O$ Y$ Z9 y6 U v
show(); $ v. L6 I$ d2 @$ Y8 a0 e0 F
return 0; ' S# w, e9 M' s4 ~' T& O- Y
} / b! o2 V) U) W
+ w& [/ J4 k5 D0 ?. P保存为invoke.c,按照如下gcc开关编译:
4 }, d$ t# p; U4 o* C3 w- W+ J% [' a& |1 o+ H: L' S
$ gcc -o test invoke.c ./libmyso.so 2 U q+ r/ T9 r/ T$ _; w
, \4 u8 ^# l) b% v8 ~: y 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
; B2 W3 E( X | ^% C3 |$ ^
+ F1 |+ b! ]* i1 S# [& U% @测试输出结果如下:
- X- j' U& x7 {* I; Q2 T
2 f3 [) I! W& T, Y; {1 Y$ ./test
, Q+ j, b6 Q$ k T1 r
9 T. o3 X, M$ C5 J7 h# JInvoke my so
' _# B g. H0 j& H" V& V3 y3 `, M% Z* Z2 m- @
Standard Object by gashero |
|