|
|
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 1 x8 x! o- ~* [
, B5 J9 `) I9 U$ |#include <stdio.h>8 g8 j4 l; b5 K4 O6 W& R; {3 ?1 k8 D9 `
; e! H9 w2 U/ {3 T$ a& D3 lvoid show() l* U% o5 q0 K$ {) M5 }
{
- N- B' X" X3 W$ a printf("Standard Object by gashero\n"); / {/ m: {; O7 B5 C
}
) H1 v4 A5 ^+ C
6 N. K: r4 O# T! `保存为myso.c文件,按照如下编译: 5 d$ C/ f) H9 S! M* g
' `9 J* J5 s' X0 [( ]; t7 ]
$ gcc -fPIC -shared -o libmyso.so myso.c
3 T: k [( V( x9 q) J
6 e( d9 ^' l# y1 T6 | 执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 / D" |7 d* S1 I/ u! g1 u+ W4 f
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: : {$ q8 _& |0 m8 ^9 r
+ p* Z! A* D* T# w |- z3 e) L- Y#include <stdio.h># x% S; h' O6 r' f/ J; T
% X8 ~9 d2 v- S; x& Xint main() 1 \5 u2 a1 m4 a* [3 m
{
7 }. i" [+ z" ~, g7 z8 r printf("Invoke my so\n");
# ^; z& C/ j/ P9 o9 k; G show();
2 {/ }1 s- ~) S* e return 0;
4 P8 e2 z x2 E5 S G# \$ D}
: _/ I- \4 E6 W6 U
& k4 X7 X, X. t& [* w9 `保存为invoke.c,按照如下gcc开关编译: 1 x8 ?4 m# X$ I
2 e$ n6 J3 e! \2 y- h/ V
$ gcc -o test invoke.c ./libmyso.so
0 J; S7 x" E! M3 ^1 S
; k' R; J% _# r* C9 q 编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 9 O1 i" h: U* M
4 [ O, }' B5 B( ]
测试输出结果如下:
d$ U Q1 F& L' F( P
1 Q r) s% g" ]1 J7 R$ ./test
% b8 i2 ?/ W! G0 V3 r% @: D; v
: C5 M# ]2 u b* uInvoke my so
! P6 s; c( r! y t! n. d
, e+ ^0 ]; H7 z- N( @) P; F8 c" XStandard Object by gashero |
|