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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: ! C& f* X& _- d6 \, z# C

, m6 i) u2 i& Q* X#include <stdio.h>
# V% `6 m6 D6 B; C6 a7 G& }0 i, |# J3 w, c
void show()
, K6 W7 R1 `7 K7 b5 w7 H" c{
; o" Z0 l6 T1 n' b; y7 D    printf("Standard Object by gashero\n"); * t; W, u, X  u8 W" Q$ V* V+ c' S
}
& n& Z( I$ e# P, k; t3 v% p1 L. @& l4 l' H
保存为myso.c文件,按照如下编译:
+ u% L% _: d* K; N4 }
- g6 c$ {# G+ O# p" Q) U$ gcc -fPIC -shared -o libmyso.so myso.c , R/ t! X* g( q
' H: Z7 C. X. `
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
, L8 j- d% N2 t  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
+ Z4 c6 o) c- N% d. x; f
  Y) a3 y7 ~3 w6 [( R( c#include <stdio.h>
4 U' t- d5 [9 X
1 R) f% k- `+ B" V3 j) X3 C7 Pint main()
! y8 h! A; {6 M: E' Z- F5 h{
- {! s$ v  ?4 d* ]3 G   printf("Invoke my so\n");
0 J9 C9 Y* M. |/ }- p& n   show(); % e: v  o5 W( _1 J
  return 0;   ~5 b5 a8 n# P* K" I
}
6 H! ?) ^- s9 `2 Q3 y# g/ {% W
  @- z7 \& ]! D" r保存为invoke.c,按照如下gcc开关编译: * h4 `! r: c/ A' ^

* T5 d8 p- l$ l$ u+ \$ gcc -o test invoke.c ./libmyso.so , ?7 A+ f  {) z7 X
, W" J" k; S2 j3 u1 E
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 0 @) W9 E/ S* s9 }: g2 M
) S! M9 A2 b. ]: ]4 E" c$ g
测试输出结果如下:
* ?) Y+ S* w; N. D9 G1 H8 F) J( q
' t) C2 R) Q, A$ ./test . R: f2 I$ [* \" V9 A# G' k

" Y( o) ?: D4 V1 q0 ?" YInvoke my so / d; U  ~2 V& V( O
: G7 C. c* w& `! J) T9 f- I
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 04:44 , Processed in 0.014028 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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