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

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

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

2 T7 S5 U; k  i% dvoid show()   h5 V: V9 _+ Y  _- {# r. _8 x
{ - x$ Y" T2 {3 L+ H1 `5 V3 }5 ~* M
   printf("Standard Object by gashero\n");   o1 p, f- g5 c5 h: C$ Y3 U
} + ^/ h& `# e: }+ ~4 {
3 D  _+ Z: u; C  H1 U' ]/ Z
保存为myso.c文件,按照如下编译: ; P" n# E, c2 w

  Z) v8 J$ H5 t% K+ i" T$ gcc -fPIC -shared -o libmyso.so myso.c 2 @% I  o1 a3 [5 z5 J; T+ n
0 k/ `5 w1 w' @5 P
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 9 s1 M* q% I8 Q/ j3 r4 k
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: # n  [1 U/ t' F$ Y

% w* e# m) Q! Y2 U3 I3 `, j#include <stdio.h>
% ^& q  o9 ~+ j" A  `
! b3 Z' O# P+ ]1 e+ i: kint main() . w$ E' ~: s2 i& D0 X
{
1 }3 H; {+ a; K# K   printf("Invoke my so\n");
2 w8 _5 M" Q* B# _6 ~% r/ [/ j   show();
; |3 N" Y# P- n) B7 G7 S5 h  j   return 0; ) R1 V0 \) u8 u# ^
} 7 p6 }7 J; Z$ m3 n$ n/ g* ~
. ^2 w. w9 r: ~6 t
保存为invoke.c,按照如下gcc开关编译:
! t: E: f* _7 @, }3 E6 S0 Q2 L: K" f& C
$ gcc -o test invoke.c ./libmyso.so
5 V7 |& a: ?: L* c, h/ i1 U' a1 m$ Y( U/ F% B
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 % \* w8 v# J8 e+ e9 P9 Z9 Y* x/ x

8 B. V- t$ A4 i: `) h测试输出结果如下: ' Q9 n* e. b4 [  y/ j! e

1 O7 U0 w" C) z4 C1 V$ ./test + X$ P, P+ m0 I1 N
2 E0 z  ]8 D: b) J# h
Invoke my so + k+ g' }: B( y  `: v' l# h

+ n  P. N: ^+ H: h' ?+ ^7 WStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 01:38 , Processed in 0.033864 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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