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

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

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

0 O: X) s/ g% `1 J( u#include <stdio.h>
% D* `) {1 C- `: Q' \
' |0 a7 F( ~3 V; o1 v. |* ^# ?. Bvoid show() / c  c$ {/ g; A: R1 `6 o; X5 \$ [
{ ) g" Y2 ?; g9 M% R/ L- Z; P0 q
   printf("Standard Object by gashero\n"); ( [1 ?* O8 {0 N. H$ }0 V/ i$ M$ ]
} / c6 Z, O9 w. s4 f" _% D7 j
/ q+ K  r" o; @4 M& L, m
保存为myso.c文件,按照如下编译: % Z7 j& R# O' N: K
+ ~" g; n4 s! i+ r# @
$ gcc -fPIC -shared -o libmyso.so myso.c - R6 T) A6 j, B" c( |3 K
! k; Q. A0 J: t4 {( |% q2 P
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
: I7 a! h6 j/ |) |" I1 W( P  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
( k, [+ N' h1 L- d! @% O4 O# I+ _# _* p4 H& |# k2 a
#include <stdio.h>+ o) u' q' Z5 a' x
. D" }' U# S4 c1 E0 \* F# w) j
int main()   c! D1 g! x  v1 |/ f7 |, O
{
3 G( y9 }: k) t/ m! s   printf("Invoke my so\n");
% e: _) C0 n: N0 G   show();
5 Z. `: p3 k9 u2 J   return 0;
/ w  v, ?# q6 m" ^}
! x: h  L' e- Y: z7 E$ y9 V
- K5 b( d8 K5 I/ f" B1 o; c8 w保存为invoke.c,按照如下gcc开关编译: / G9 I8 K( P4 E0 N+ ?" {/ B# P5 |5 @

1 C5 V0 x  [- j% I- I/ Y( r) U6 ~$ gcc -o test invoke.c ./libmyso.so 2 q6 U, D1 @& Z7 n6 F1 m: X
' S* E  Q/ \8 b; @
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
+ H7 m5 K! y2 i: C; u( M' m8 s; W0 U9 i0 Z; t5 r7 H% e  R& |" q" s
测试输出结果如下:
5 a1 R8 e( K/ Q0 K2 w$ t( C
' Z2 X" F. b# H4 ~$ ./test
; ?+ I" n1 V% O- J! V: {
7 a4 `8 I4 {/ B8 \2 r$ A8 LInvoke my so
! e; l) O7 E* V  t" b9 v4 G7 `  K8 p
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 20:15 , Processed in 0.019013 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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