|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
! q, u0 P1 v+ t3 {
1 {5 }8 ~4 H; M8 j* G* o! A9 W#include <stdio.h>
/ U7 m( O3 q8 ^7 O
" Y6 |" n- d; w6 o- b7 [6 _! Evoid show() - A7 ?* T# g1 j2 q* m
{
% o" a4 ]6 `! \! M printf("Standard Object by gashero\n");
2 u$ m, q0 Z: s, K, |/ B0 i# x} 5 D6 ?; |; j) I2 b. b/ ^; ?6 r
4 g9 C) V7 t; j% i- D& ?; o
保存为myso.c文件,按照如下编译:
6 G/ \# ]5 Z, W5 m9 u9 ^- ~: q% ]' ]7 M; C' F' K, _" r
$ gcc -fPIC -shared -o libmyso.so myso.c , i: @- x' C# t
) i6 U; M& t( y4 P 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
9 A# k4 C0 |. R+ X* C 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
+ e' k' |! Q$ B" V( x( q2 Y3 N; G* S0 m7 a
#include <stdio.h>1 ]) K) f0 I5 ]' Z9 \# l
9 j% h5 I) V' c+ V* g- X. W
int main()
9 E4 R9 Q9 v9 X& {' n [% Q{ 0 K& |$ M/ r% Z$ L# t
printf("Invoke my so\n"); 8 Q( y' z% i# k
show();
% \$ a% P5 X# S4 Y return 0; 9 y' {7 v: S1 G4 h: m; [5 p: S
} 7 v3 o" F# g6 u' ]! Q
3 J. ~/ U3 F: s' K; e2 @1 ?保存为invoke.c,按照如下gcc开关编译: 4 b1 `! b7 k5 k) i: W ] L: ^
/ V% k& Z; m0 S1 A- l2 o0 ]3 F& B6 z
$ gcc -o test invoke.c ./libmyso.so 3 @' Z6 e4 N* X7 H8 y' z
% K' a+ C* d4 L3 S8 b
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
/ k1 ]) V& [2 Q/ T4 \! V( p. Z) L) x: V4 l% v% j0 H6 k' G- x
测试输出结果如下:
& \$ {! G3 ?+ k' v6 T3 ~8 L) g" Z
4 \( Q- O* q7 y+ c8 V* [" E3 a `$ ./test
# I% t2 A+ p2 P* Y1 r
0 j$ k6 X: c \0 C4 ]. l8 kInvoke my so 1 ]& V) U6 X; S$ l
$ v3 ^8 N6 w( |# m# ?; OStandard Object by gashero |
|