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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
/ L4 f. S0 B+ d
0 Y: [: H1 R# a( q# }#include <stdio.h>
  ]% @# g8 ^7 E9 d$ a& U, z! E; `. m5 C. C2 J; `  t
void show() 1 o: M# T  _; f) l4 j- T
{
9 r' `+ v9 }6 J! \    printf("Standard Object by gashero\n"); 8 f! b6 U2 K/ z; H/ o7 Z) a
} ( A' x' Q' ?# z) ]% I0 E
& a# F! Z% l# X* z5 S% F
保存为myso.c文件,按照如下编译: + ]1 R$ r7 T& _/ T& f" n

% P) v* z) K" R$ gcc -fPIC -shared -o libmyso.so myso.c
: n& g! S" S) ~. Z+ i/ Q% s% b4 G* c, d  N  l" V2 Y
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
5 ]8 a* p2 ]: L/ k  M  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
* Q) ^) Y/ {. ]8 t, q# j. [- p$ \3 A  P* v% r' V7 g
#include <stdio.h>
5 r( e8 q/ Q4 O- n/ k
/ ^) U$ t- y7 ^( t8 E9 o" rint main()
1 R- U; \/ W1 k4 F{
) C! Y& G! |( J- ~   printf("Invoke my so\n");   E" i/ S& x7 I$ }6 E$ ]( [4 k
  show(); 7 m& ^$ m+ f4 ~1 [
  return 0;
/ X# Y* B6 q. J}
" }6 `: Z2 ~  a" v$ ]4 a8 V9 Q7 |! k% _8 w1 O, U
保存为invoke.c,按照如下gcc开关编译:
. w. `  K9 p0 g. {1 N3 S; J/ u
0 o. G, V, R$ ?8 D3 m$ gcc -o test invoke.c ./libmyso.so 0 h. V2 u$ a0 q2 P# ^& P/ f

, D* @/ M* q2 ]+ X$ A8 e  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
; G' N3 u3 p( K9 @' K' H
7 }% g% v# ]0 E; v9 N测试输出结果如下:
* J4 ]' h' s; ?! ~( j+ Y/ x. ]$ w9 v- J4 Z* X. V% v8 ^
$ ./test
- K+ _- l/ l. Q# T3 q
6 w- r( S- V# ~' E. w8 GInvoke my so
$ o: u  E* Y! r( D
1 ^0 L7 n( o" c3 |2 oStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:14 , Processed in 0.017239 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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