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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:   u: n$ f& z7 E! {2 e3 J' N9 f
, \" I: M) o7 l+ _. C* K4 s
#include <stdio.h>
* F0 m2 M3 C' ?7 F" G3 R- ^( C# ?$ o3 L# C- x* M2 `5 p
void show()
  h. t9 m) d1 D( b" {! h{
+ W0 I" ?$ m7 H# S- ^- Q. O    printf("Standard Object by gashero\n");
) d/ ~* e2 A/ Q/ k}
, A1 a( C0 l5 e
7 B$ G" D2 }6 V+ S保存为myso.c文件,按照如下编译: % s  @$ h& U. B! Z+ ^' h9 u0 \8 m
4 \! z! I. Q2 `& N+ N8 T2 W4 t
$ gcc -fPIC -shared -o libmyso.so myso.c
+ U! M, e+ m% y" J$ v
- D; O! r9 N& i  ^  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
) s2 {4 M9 W# {9 S5 \6 O  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
, f7 O" V" n8 I  {  v" h6 X  O% t- X, d3 n2 O4 s
#include <stdio.h>
/ o) \; v) t4 ]5 J; o( t( Y* ~4 l) L
int main()
) S. a$ G8 J/ R% m{ 2 B3 \4 J$ u+ U/ z
  printf("Invoke my so\n");
; t# m2 h) O9 Q3 j& S4 c   show(); 1 V( f, t/ T3 ~: W2 m- h/ c
  return 0; 9 G5 v9 S8 b5 x- H- c+ i
}
$ z" a/ p5 W5 U% }1 h
1 W% F" B' q' t1 S3 V9 x保存为invoke.c,按照如下gcc开关编译: 1 K& }% m" P1 G- _9 m& J$ B3 x
7 ^, ^8 O) B) V* a- l
$ gcc -o test invoke.c ./libmyso.so & I! ~4 w3 e& z) D2 r* F

% L) t; q7 }$ X3 Z7 A. |  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 / P" Z/ D* L% y$ S7 M* I. V: r3 \

- K  I/ D3 V1 t, \. \4 @测试输出结果如下: " O# q; r5 E# j
  K7 k4 h+ P% ^
$ ./test 2 |# _7 F) S, w4 s1 E6 u
. H2 P5 X3 O) d* }) j" N. v! F+ R
Invoke my so + T  j, f6 J' r! ^" ^, K

% m+ z7 f  B( b4 `' r8 nStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:35 , Processed in 0.033413 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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