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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: % s# Z) f! c8 c' b( F/ j1 ~$ {
( R1 \. e* x  R, K: C8 S+ C/ g+ m
#include <stdio.h>- [8 z$ r; s& P% u  [9 o& R
3 L2 C$ E: B8 \
void show() ; }1 M8 i! @! l  G  A. ~
{
8 L8 Z: e) \1 g1 j    printf("Standard Object by gashero\n"); 4 T* L) n& w# e# i6 _# C: B
} ' k! w6 j7 l, U
2 E9 [$ r& q( Q$ @) D- C
保存为myso.c文件,按照如下编译:
2 A* J/ q3 O7 {* J8 ~& B" |) w
& T2 u+ ]3 t, B/ a$ p8 K$ gcc -fPIC -shared -o libmyso.so myso.c : _! G* W  o7 {  c% i
: I0 g5 t$ I$ B+ J3 @9 Q; y( b
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
  S7 b8 L( l+ y5 o0 E, _  v  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: $ o3 F: P, i( V& C

' p5 B. m) U) g5 v) [9 ^+ S& P#include <stdio.h>
8 S+ \$ f- J/ l8 k2 e5 M+ _; \* P# F7 D& C3 z3 G
int main()   G5 @4 x3 o" {; C5 q
{ ; ~0 Y- [4 p5 o* L
  printf("Invoke my so\n"); : e' {1 b) V" [+ _# F7 Z. y& ^
  show(); . e7 R! z4 A: J# k, X3 x
  return 0;
0 g) z5 ^- C. M2 m2 H} 5 ^. X  J9 k# ]8 }" L( a- n

: Y( Q0 K6 n3 ^2 _保存为invoke.c,按照如下gcc开关编译:
# z3 v# ^1 B, h! y3 v1 U6 W# {! K
; p8 B9 C1 R$ b; D0 _  i$ gcc -o test invoke.c ./libmyso.so
6 h' b2 k/ L! ?9 y: {
# A3 w) K1 ~8 a0 ?/ f2 e  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 ' d3 U, v  J/ S: F6 x6 W, }: I, j. s
$ C) q/ f$ z" g8 k9 U3 u' \- V% T  e
测试输出结果如下: 5 Q) D3 C0 s6 h1 Q1 I

" ]4 [; D& ?2 C4 `# d$ ./test
& b8 d  c" A" [9 v4 [3 C& ?9 _7 D  @) D7 @; ?9 S
Invoke my so
) p7 n- {6 t4 m5 n4 A) |  w# ~3 F0 `
) \: ~% ?% S7 u  Y4 `# y0 Y" o/ mStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 08:22 , Processed in 0.019252 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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