|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: - M0 L4 T, X6 z) s4 K
3 K: J2 G, b. |" y+ u
#include <stdio.h>
L+ Q2 F4 b: N* I0 W4 d. g: i6 e# E' _& D
void show() h, O& s% v" M& ~8 u8 X$ u% c
{
7 |8 a" ~' p+ b0 h2 f printf("Standard Object by gashero\n");
: m' d1 [7 ?) f. c9 [}
6 K0 m+ j) c, ]2 ~# {( f9 L9 ^
+ F. z6 n1 V# _* J6 N4 w+ z! i1 Z保存为myso.c文件,按照如下编译: 4 t( t. R1 O6 I: A- T* a7 y
! G5 U3 A5 G$ y- ]
$ gcc -fPIC -shared -o libmyso.so myso.c
0 {5 y& w. O8 K& N7 K4 G# o" U/ N$ ]( P9 }
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
- d+ h' k1 N+ I& D% r. R 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
6 k0 i* K5 ]6 [3 j0 b
' z" {+ G Y( w8 r/ R6 E#include <stdio.h>
# d$ A `; y3 B( f. u7 M
" P) o' d) d' Y* xint main() " D# }) E, v( ^6 b
{ 2 h% M& f+ a% H \& G" h
printf("Invoke my so\n");
6 _# h$ X: l* j$ L show();
5 _9 H# N* V: j$ z1 U return 0; 5 A! y' J9 @# C$ O
} " o* N; t; G. I# s5 v6 H* D2 G
3 |+ b; K' w1 P5 z" Q, N. M7 G( I( V4 Y
保存为invoke.c,按照如下gcc开关编译: % B% m4 ?' g0 k# W
" q* D' ]" J( W2 g7 T$ gcc -o test invoke.c ./libmyso.so , Y! F5 F0 P* p( T: c7 b
) O, y! `1 N" L4 p1 ^1 D
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
( J: o( O4 M4 q0 C5 W$ N) |2 T8 @6 x9 M
测试输出结果如下: 9 r( a: f% ~& o7 z8 K
5 J4 B6 ?4 M4 c: Q$ ./test
2 P* b7 k) }6 S
) r6 C' E+ b" L% iInvoke my so 1 }- L3 M+ e9 r8 W; h) N* h
7 P' S# v1 L) f3 k2 h8 i! X) j6 x
Standard Object by gashero |
|