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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 9 B9 L. n/ K% ?# I, e1 O8 y4 I! d

; r9 b% J, r7 n7 I. |0 J( V#include <stdio.h>
; }- U# m* E- O: h/ U# {" ?8 ]0 M3 T9 \5 `, N  ^
void show() ! x9 P) _5 x" M. r( c
{
; S  d. W/ M7 d- s2 N  j  `    printf("Standard Object by gashero\n"); + r% |( D) }* N9 m$ M0 z
} ( t8 p, K( h8 {+ k, I8 M% g

2 I" R4 k* D! |- k7 t0 q* f保存为myso.c文件,按照如下编译:
9 ~& P# P4 ^- q% F7 {3 |3 @+ X; ~
$ gcc -fPIC -shared -o libmyso.so myso.c ' Z0 F$ @# V* l
1 L. _6 y' m2 C
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
( w2 J4 y: a& i4 y% U5 `! K$ ^5 i" h  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: . _, F; {+ d. _* ?

+ f7 L& d! _/ f* \3 i8 V#include <stdio.h>
' y0 V' M# v* D' Z( b4 g) j. N: x" F' i
int main()
5 ^4 a5 L* `# v3 B/ n* \{
' k& s0 }( F; u0 u& l: z   printf("Invoke my so\n"); ) K! h8 `2 h0 F. G5 [7 I& U/ O
  show();
! m$ r$ P2 @6 z& T3 _* S   return 0;
) T7 ?; z; J% T& R0 L}
/ ~' z0 R$ l& H( W6 }9 F3 Z0 ?
/ z5 k: \) q6 e5 X+ W  B2 |8 N; U' h保存为invoke.c,按照如下gcc开关编译:
% I6 C/ ]3 W- k& l) q" b/ p) o, A! I
$ gcc -o test invoke.c ./libmyso.so
) b) w9 S9 J0 p# U5 ~& M  F2 T) Q  f5 P7 U' F
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 ) f& i6 I/ X1 B3 n* h
) Y! j' K6 z" s
测试输出结果如下: # M  @3 G7 J4 Y7 w
$ F  d! q; C- _0 p1 M
$ ./test
/ J4 A+ e) Z( k: |* ?( q  z" P, C0 J  m# t6 f0 z
Invoke my so   N- C9 J# c; P; q, X
- H; y, k6 n0 W! G. q' y% g& z
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:52 , Processed in 0.019037 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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