找回密码
 注册
搜索
查看: 4661|回复: 0

[收藏]Linux 动态链接库编程入门

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
- V$ Y' n3 ~2 |. K) B" O
6 B% s4 E3 p5 r4 s3 L' ~7 D- C1 ^* D#include <stdio.h>4 o3 t- L/ d" o, H2 \5 g0 r

5 X' h) x# `! w8 J; |void show()
% }; b) a. I1 h{
$ {* z& s5 F  ~/ ^* u" o2 h    printf("Standard Object by gashero\n"); . x3 O  N$ `) C0 R& c
}
+ l. P: o0 i, n4 C5 W/ m" z, t# A
* L8 ~4 }* p# c, k保存为myso.c文件,按照如下编译: 2 }8 S6 m6 v7 c
% y7 F( S, p( U3 H8 m9 D) v( O7 x/ j! p
$ gcc -fPIC -shared -o libmyso.so myso.c
/ `) ~$ g' g. ~+ Y/ O
! S3 o2 G4 L2 A( X( i& l: N  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
$ L+ c. Z2 l" v- w2 ?  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
0 z. Y& S+ B& _0 L% u) k2 F% E; @. ]6 a" G
#include <stdio.h>0 r# |& [6 P4 B8 z7 x

: J! H6 N8 q& F3 `# r) yint main() + J* ~1 ^  @& b0 U
{ 7 s" Q  C' g/ C9 t$ d8 t
  printf("Invoke my so\n"); ; R2 X) j8 W3 s
  show();
0 @/ Z6 \+ |; o2 g8 ~8 F1 ], j   return 0; 1 V1 u. p$ j7 O  L
} 7 ~0 B8 \" g, J8 N' U
# {2 g% Z$ U2 L9 T6 c
保存为invoke.c,按照如下gcc开关编译: ; v2 O/ D: n: o8 t' d# d% t  m

2 B# `* k  [6 w+ P& E! C6 q$ gcc -o test invoke.c ./libmyso.so
9 `& g8 O+ o2 J$ D/ ~
* U6 V, @+ v' }9 h, I  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
* {- T; ^6 ]) G" |5 n% D; V: D# N0 r! y4 ^
测试输出结果如下:
* ^8 a5 i9 U2 f: |- D! t/ q  b
! b; H0 u6 L# P! s# I0 S  g$ ./test ( N) o3 G1 W; n5 S& S/ _
4 ?, p- P$ [$ c5 C, u9 [
Invoke my so
: ?) x5 H; C. o4 y4 l3 a" |3 q0 v, h3 q0 e! x2 n# V. Q
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-11-15 13:06 , Processed in 0.021135 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表