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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:   q6 [# k7 U1 p! h0 S4 v9 j3 G
0 W6 i- y8 Z+ q" m; ?& C
#include <stdio.h>
" s+ G. B5 h- C% e/ w: f. H" f
9 h. J! A+ c/ B" F% bvoid show()
& T% @8 ?. U) c7 B6 |' b4 ~: S, U{ ! `4 `9 g" q% j( Q  @$ k
   printf("Standard Object by gashero\n");
0 \* a& u. q9 b3 S% |} 0 i8 H# {( D) S2 W: R
) d- s( e- e# N$ K6 B  l
保存为myso.c文件,按照如下编译: + H+ M) |3 w/ C; `: J3 |  z
4 z# G* U# M, s) P4 u
$ gcc -fPIC -shared -o libmyso.so myso.c
! i$ h: j5 }# [2 @# k8 }" [+ W6 p5 w# g' Y, {: L
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
  l+ T" h$ d, B2 T# k1 X2 u  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
: y6 k6 A4 ^% K  N4 Z
8 W- ]$ S& f) U5 a2 C$ e, b. x7 ~#include <stdio.h>0 Z5 s& q) u9 Z; q

; e6 D0 H" b( P/ A# `int main()
/ y/ q" y+ M1 e9 |3 }{
/ f5 C- P9 k. g( b9 w; q   printf("Invoke my so\n"); 8 c0 ~$ q3 y5 D) j2 R0 I5 E
  show(); , E0 B& r2 _+ ~# G
  return 0; ' E3 D; g8 R" m2 X# Z
}
9 s; E7 ?2 T& h, `, e
/ s6 v/ ]! A* `' n( Z保存为invoke.c,按照如下gcc开关编译:
9 D5 L! d  Z1 V+ j, k
5 L1 R; z' ~9 ~7 d& H0 }; o5 s# S$ gcc -o test invoke.c ./libmyso.so 2 S! R: f1 q% d

5 [' y/ }1 P( a2 X7 ?  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
/ h  |  j  O# s- y2 n
* w) B1 e# l' B9 L" ]测试输出结果如下: 3 {2 j8 _1 _* A
3 Z# B; R( w  J% c
$ ./test
( k" O( L8 @0 S0 V' y* R! n8 a9 a0 J
" l! S$ l* \* u+ d* GInvoke my so
) Z" ^, N5 \2 F9 j* j7 S. o7 B3 f1 k, g4 l$ h3 T" r
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 06:15 , Processed in 0.020858 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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