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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: # v. b9 ?# d7 u8 s$ \6 k
6 I1 u0 x2 n/ D( y
#include <stdio.h>
: ^; A/ g- }$ z( H) ]3 R5 K' @0 C  i; l9 }: K' k7 c
void show()
1 @: B' U0 p* o# I, x$ v{
- g  Q% W% U! d7 J    printf("Standard Object by gashero\n");
- H! E! C6 G% C3 J! W6 h}
  w& x' ~) Z& z; z( w
$ ?3 P4 f0 g/ h; Y1 o保存为myso.c文件,按照如下编译: 7 n4 I8 M& s2 {: B" M, @
( B- O( l& r# M( W
$ gcc -fPIC -shared -o libmyso.so myso.c
* }" W' s3 _' [4 `  |2 f, G/ G: i; g4 i- L6 o' k8 {0 ]
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
. h: f# _; I" s* d3 Q5 G  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
+ M. N. g. J8 m+ y" n2 O3 i. w! }: W3 F3 C( V; U+ L
#include <stdio.h>
1 R  w( z! \$ z( ?; [2 t( z! s" |6 R  Q7 Y7 j" _$ F
int main()
+ u0 o( o8 \( G" P# ~. f{ 8 r0 p; D% B/ ?7 ]6 T6 X$ k; v
  printf("Invoke my so\n");
& q+ z9 k( o6 x) W, M2 K   show(); ( q+ V, O# _& ?" ]
  return 0; 4 [3 [6 v# S" X9 z  H% @( }
} + z1 B1 w$ y5 \3 S2 c, d/ A' k
9 p9 p7 |9 v" w; `, p3 t* v
保存为invoke.c,按照如下gcc开关编译:
6 [# U9 p3 j; c' Z+ F! z7 R& s
$ }8 V7 d( t1 b$ ?) e, T$ gcc -o test invoke.c ./libmyso.so 6 Y$ Y) x+ d" p! _

4 A( m1 ]; X  A) x  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
- R& s+ q& J4 U- ?( V3 T
/ m9 L* C( q9 M( e7 _3 a测试输出结果如下:
! N& k3 D1 M* F& J1 {5 M  y
3 H3 J, t6 |0 y, i7 y0 U; j. V$ ./test * N' S$ z7 \# ], ]' r) `8 x* Z
: i+ Z4 H& }  g( D
Invoke my so
+ w7 s3 f  r4 n0 p0 {1 s4 c; m( O, B; T" k
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 09:25 , Processed in 0.014198 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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