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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
: x8 K) I4 v; k1 l% x0 d
! \4 Z% C5 b; u#include <stdio.h>: b$ l) a8 J" e1 F; d

; Y# A& }& P- q) evoid show()
: B$ w4 K, |" k9 o2 ]% r& U{
& e: K+ C; ~! D    printf("Standard Object by gashero\n");
9 r1 |+ b, |. n( u" Z# O1 ~} 4 V( I. V7 [- M4 v
+ p: p: u4 n* i
保存为myso.c文件,按照如下编译:
8 ?" ^& p0 t1 }; F( r/ m
! y+ o) l5 G3 {$ gcc -fPIC -shared -o libmyso.so myso.c ' z0 h# v, v0 b* F5 O: O1 a
5 a; P5 c/ `5 D* ?! e  L; z$ T; m3 ]
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 ) n$ q; D+ u  j- {4 Y
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
2 `: ^+ g4 t7 b
7 L1 A4 E( e) |% z! [# W#include <stdio.h>) @% k& E5 C# B$ j: f

& @3 c0 {! V" k' Sint main()
+ c2 X7 Y8 f8 e, Y, w{
* c/ i& \' L5 u% B: p$ B' P) e, _   printf("Invoke my so\n"); # g4 s  D7 [, a1 m# q
  show(); ' S3 v9 d9 E8 W5 a
  return 0; # h( K! K5 R; H4 s: s3 k
} 6 H6 }+ Z. `' p. S# W4 \8 u) r/ j

6 p, Y, q: w" I7 f- q保存为invoke.c,按照如下gcc开关编译: & I0 {! Z% C$ |0 d6 B
4 S* L  P" C1 P0 Q
$ gcc -o test invoke.c ./libmyso.so
0 F; @- c* l) w5 P4 f- t% A3 `: q4 a5 ?
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
2 a, [5 i. q# |2 E6 n
# V0 o4 E) r# I0 M) a0 s9 `测试输出结果如下:
1 e) d+ ~! |8 k% h- |
1 K, J. u* L, j* @% q  c' F, c) r  l$ ./test
3 X" M9 i+ B9 C5 h
% U, o3 a7 l) Q: l, YInvoke my so 1 @- M! ]' s6 H- A

1 k. m& M; {+ ^6 i2 ZStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:58 , Processed in 0.017159 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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