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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
) Q" w( @1 f! e: I/ X
- w) ~; E* z$ S7 q6 S#include <stdio.h>3 a$ _9 K+ B4 K

' a  M8 V  N' C, a) Fvoid show()
5 F3 ?2 e. x5 T3 [{
+ G$ q, a3 c8 d+ G% a( R# e  O    printf("Standard Object by gashero\n"); 7 x3 V7 x5 `! ]' y  B
}
2 F0 X  ?; O6 n; S, e3 G
6 |% W! s- Q7 d8 K2 }3 I" @' D保存为myso.c文件,按照如下编译:
5 i" @6 C/ e, V/ P& ^
0 o# _5 s  |# T( ?  w4 k" g$ gcc -fPIC -shared -o libmyso.so myso.c / l+ _. K( E" O- ^5 q+ Z( O

. a% P" a, |0 `6 B4 I/ {! k1 a4 i  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
! K8 |2 k* j) Z$ O- x. }  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
0 l- v* Y' G5 U
$ ^% S. l; b" `5 x% K4 k#include <stdio.h>) n# l  ~+ b& a) n/ Q

$ `3 Q# d# B4 H4 |- f% Hint main()
7 h- o9 Y% O7 T4 i: T{ 0 u2 B; N3 |  i- a" D
  printf("Invoke my so\n"); % |* R, ~9 n% u7 k4 a$ Z  [
  show(); 3 N2 p8 U! n4 A4 D
  return 0;
+ U- J1 ^0 s: I2 I' S. f}
& y1 D' z; K: {( `- z8 q8 D3 X* x* p! e; @" b2 ?$ c
保存为invoke.c,按照如下gcc开关编译: 2 G0 @1 h% J5 F/ C0 X
" N3 z+ g2 U. s* _
$ gcc -o test invoke.c ./libmyso.so   s, [/ C( S& ~6 r. T

$ G+ ~6 M7 Z2 {/ O. R  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
' C. K, t4 ], r5 q2 v
5 `+ O  E+ u; D# @! V" |. a测试输出结果如下:
5 N. }+ ]- F; }" P1 t' p# V- u' ~
$ ./test
. s) s+ C4 ^# h/ G/ z9 q% \- [& O- G; d2 _* v: t: k
Invoke my so
* ]. A8 G# L! F/ E" u
, N8 a- P! C! P" t0 ?. P) lStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 10:44 , Processed in 0.016824 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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