找回密码
 注册
查看: 5058|回复: 0

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
' v9 Y5 U& D% {2 V8 a
1 n4 _# Q. G1 ^: B* D: {* `#include <stdio.h>+ b) Q4 _( Q& N8 |

( R1 Y, d& i# \1 Evoid show() 7 _+ }& N  f3 P. H6 |( ^
{ 3 K5 Z4 ^, m9 {  P. @/ U
   printf("Standard Object by gashero\n"); 8 ~. t* U! @, v4 j' @* ^/ s
} - X- g; D: C& M

! V! M- H9 ]: o6 Q, g3 |, `# Z3 s保存为myso.c文件,按照如下编译:   ~; U0 B4 {1 D% x( \2 ]6 P& ?
1 p8 s# W9 n  l( }. R5 N9 T3 q3 Z% v
$ gcc -fPIC -shared -o libmyso.so myso.c
4 N9 S4 c: v3 ]& A
# G5 T: y0 @1 h6 r( j- T: |- s  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
: [/ T: L5 M! b' L- M+ J* \5 `% J  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: + c6 l9 k9 s- C  U6 @: s+ B
' Z2 {5 q& J* H# O5 ^/ U/ l
#include <stdio.h>
; a4 E: h: N% j1 S' j0 M5 p8 f! A7 Q. U7 U6 a
int main()
6 y* ?( C& H$ f% y% [* ^0 z{ 1 w. m8 z  C- F; X( v1 \' b
  printf("Invoke my so\n"); 1 B: x  W) |! \3 G
  show();
& z! u& v% ^6 g( ^8 j   return 0; & x! s) }5 h& j: w2 l
}
1 Y" F1 S4 q5 z+ r. \5 J# u
' _! I  z  z+ ~' r) [保存为invoke.c,按照如下gcc开关编译: + x8 c$ `& j  a1 G# z  Y- j! y0 F9 `

: P8 j" x& Y" _1 i5 m$ gcc -o test invoke.c ./libmyso.so
$ P0 I9 o. M: q0 H) |9 i
7 O+ n: B1 f" i9 Z  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 ; Z  w1 W4 @, J: c' ^, j/ C6 B
$ z' r' x/ ?% a) G8 s
测试输出结果如下: ; G+ Q+ ~+ o& L3 k

5 m( B/ ^( R/ B0 J4 A* @$ ./test
7 y" O* X& L$ c0 Y1 ]) ~* z
; \8 L2 B* [% j  yInvoke my so / `4 `- s/ f0 ^# Y

9 ~6 V* m, y, S. LStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 05:02 , Processed in 0.015376 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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