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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
+ |: z3 o" \+ P2 ]& ^- F: Q/ V% j) D: {
#include <stdio.h>+ f/ |  E2 ?, o3 |; p8 w& X; N
  A6 ^7 i8 S6 W" n4 E7 |
void show()
; b7 t8 T; P4 X, N1 a5 v' b{
' [( J4 i. S+ [    printf("Standard Object by gashero\n"); 5 I2 P5 \  X3 Y: c. q7 C+ y! q
} / K- ]; G# i8 @% H8 v$ b* j
1 H9 c$ z2 P' h- H/ L! O1 V3 ?# T
保存为myso.c文件,按照如下编译:
* S8 f2 W# z5 c# x5 U4 o  x9 t- _+ v! I
$ gcc -fPIC -shared -o libmyso.so myso.c ' d8 x) U) {( k; W- t6 H
7 W' t) t, @& d; Y
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
$ C0 F# P# y$ K# E  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: : G2 g( F) b5 W8 Z
* M1 \& W  n1 E  O& U, v" l& U
#include <stdio.h>
) v$ h# B! c* m; J: ~) X- v7 W
! n0 m  J8 X4 m0 T" [1 V4 l$ |3 N3 }int main()
7 O( P; u4 h. H9 ]{
6 g3 P8 h* {, I) Q- @9 G3 L9 g' x( T   printf("Invoke my so\n");
2 q$ y5 A1 [' L6 s. i   show(); ( w, r" x; [* v8 O4 k
  return 0; ' }6 G7 U  q6 W
} . R+ ?8 H* p& B) O: L

- I8 i/ ^0 @0 A1 C+ Z保存为invoke.c,按照如下gcc开关编译:
) d2 z! z3 s. b1 m. X5 X/ m# v
6 k$ s+ u2 y8 Q3 ?# O. z0 r$ gcc -o test invoke.c ./libmyso.so
9 k4 l+ W- ~& V* Y: U+ q
. m& p" m+ n5 M: o$ X; ^  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
: s2 ^) E( f/ _6 F  E4 E: l+ `2 S; D7 z) E6 t" n
测试输出结果如下: 4 ^& G: L# ]( c% ~+ r4 x

3 N8 E1 e; n* W9 w: P+ m9 q; [$ ./test
% j$ S0 ]0 G- m7 u' m0 A$ M5 ?# U. B4 q4 \! I" W  ^
Invoke my so 2 s7 ~( w0 s! M1 t' W
& H) c5 A9 z" e  T3 D( |
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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