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

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

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

1 B7 O1 Z- d+ S4 ~: E6 _. P# c  }& K#include <stdio.h>* W/ S' G7 A. z6 L- v

' w5 X) [  U, T  Q1 l4 I' ]# q+ ^void show() 1 E+ ?3 T% }/ h+ }. y+ I* D
{ - _) D  w3 X: O( b- x/ A
   printf("Standard Object by gashero\n");
9 B2 O1 [, {+ K; x) B}   h3 C3 }3 D3 k# v/ E* ]8 h- M2 K. Y

% q; y& f1 o8 t9 C8 _+ F. e保存为myso.c文件,按照如下编译:
! _& I% D5 f# K* q2 C+ C' I  p+ i9 f% K$ v1 D0 L
$ gcc -fPIC -shared -o libmyso.so myso.c - N; u- _1 }% M0 G9 I" ~3 M
9 k' u% b$ h* s1 [& \/ j$ P
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
8 K3 L% P* M! S: i* p) O* \/ t  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
. I* d2 N1 w- e/ o2 G! G  b  Z1 p( ]1 |8 P* x5 [6 I
#include <stdio.h>8 T4 K' U: ]0 I+ k# T- P  B% E* d
( D6 [& |' ^7 V% Q# D, i# i, O
int main() 2 _# f& Q0 @7 V6 @
{
. E0 i3 O/ V6 q, d+ Z- P2 h   printf("Invoke my so\n");
/ g8 u  `# n3 S7 h   show(); & O( m% G% k( D. H: [% W
  return 0; 9 W( V$ g0 ~1 }8 z2 t' F( \
} : e/ ~6 t9 P  z# V
. _' G8 \+ ^  @7 B( M7 [5 e0 H
保存为invoke.c,按照如下gcc开关编译:
) j! o" B8 K# m. [" \5 B: [$ I2 t) T' x7 _( a# o# t
$ gcc -o test invoke.c ./libmyso.so
6 A. m# q) s; v) Y
; Q. T0 k  B3 I  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 5 \* t2 F; m3 U  p
  d- g1 ^$ ^9 O
测试输出结果如下:
$ M% E( s* d# u% `7 z# ^5 L6 E- G, `7 S; y7 G
$ ./test 7 ~' |# T, M) a

2 |$ J2 p2 z. T- kInvoke my so
# j8 b8 D, @' x  i! m
/ z2 ^  I/ H/ Z' y# j( i, DStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 11:45 , Processed in 0.017732 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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