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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: ( T8 R, z# x, e7 z& _+ h! _9 m" y( w
' m* {* G( W9 d, b. z
#include <stdio.h>
% B* @1 c4 X; _. p* E8 }6 A0 a" y9 K/ j/ C) p* n6 }
void show()
* P% J" D% C4 h' J- ^{
2 K- k3 G: v3 I# `- Y- ^* z    printf("Standard Object by gashero\n");
% a, ?( \8 U, g& O6 {& _0 r% y}
3 i; s$ Y. r2 f$ p+ l$ D( I  E* d" Z
保存为myso.c文件,按照如下编译:
" e+ N+ H( G( O* {/ s
) V4 D8 g3 N% v5 p' ~3 N: ~$ gcc -fPIC -shared -o libmyso.so myso.c ! z( p: [4 }" v# n; L, L' j
; A: M# }  `1 C7 |7 W, u/ P
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
& K3 E. a) z4 t3 s: B) L  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: # S' S( H+ [" a. H9 [, x: a% a

6 C. x3 A9 r+ k, |7 h#include <stdio.h>% c* \2 |! d8 y" V: t. ^7 q/ o

9 P$ {* s! x# a/ x; `5 z; Rint main()
& K1 Y' q0 e& K; {5 c{ 8 a3 Y: N+ C- w2 x& t
  printf("Invoke my so\n"); 4 q, v( ^& ^; @% O6 N+ l9 a
  show(); & r. z3 J' Y  h6 ]" d
  return 0; . t. p! K# N, E) e3 O' h# I7 e, n
}
. ?9 l$ W/ V6 ]. ?/ ?
* h8 Y  o6 _# @保存为invoke.c,按照如下gcc开关编译:
6 p6 i- ?3 L$ t3 j7 O5 W; r! u* \
5 N' `" z* k, l% r! h9 _! Q9 C$ gcc -o test invoke.c ./libmyso.so
9 A2 E+ Q* q% ]& w. t  k% x& b9 d! Z2 Q$ v$ s/ y- H/ i
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
; I7 x& r6 p' `8 G
2 M' a: U+ ~, F5 _测试输出结果如下: $ T6 I/ x, u8 j" \" r- F6 e
& |6 }# n' [- B( R+ }
$ ./test
& h! J# B& O0 e9 k
6 U( b" M5 y/ ?5 QInvoke my so 6 q9 u6 p+ X+ N# _5 z+ i

" K) y9 f$ u5 j9 P, I8 X8 k* rStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 07:12 , Processed in 0.033414 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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