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

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

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

+ x. @% J! E. Z, u#include <stdio.h>
1 d" w+ p- M! T1 k2 p$ v9 J3 j" Q. Z: ?- d' t0 k6 N: ~
void show() 6 ]3 ^4 a" v8 i
{
; `, A( f# g2 t    printf("Standard Object by gashero\n");
# R$ _) p1 g4 v9 Q3 Z5 i0 `} ! K+ f$ U: H6 E0 I) L
2 i5 Z6 U# U0 \0 G& G
保存为myso.c文件,按照如下编译: 2 e- V5 b3 q6 w% Z2 d

8 U4 @3 v0 N) D$ gcc -fPIC -shared -o libmyso.so myso.c
. a" g$ L: q3 c9 f) ^2 l5 \* v
1 ?, `9 @! S. i+ H* s& \: `  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 3 Y) O) d# ~! C4 J
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: 8 C9 i8 E9 ^6 s6 v: y& G0 L6 E

  |" U# `- Z* s( e! Y& r! k#include <stdio.h>
- L: O9 |. x/ t+ ?7 T. T/ a) W3 B3 F$ _/ j, F6 ^
int main()
$ _" t" C$ }- g: Q& U: l{
, i3 `, k: s( E+ n   printf("Invoke my so\n"); ( w& y' P5 N/ R5 H  O
  show(); * [8 t( B' L$ s3 H9 W# B
  return 0; 5 M7 H+ Y: W+ D& ]
} - J6 f7 h$ O( x7 r

$ {5 V+ W0 n/ s' `& u保存为invoke.c,按照如下gcc开关编译: 8 K9 \- @' Y, H4 n! ~( c- }$ }
8 Q' \9 x3 ?' y7 e2 I
$ gcc -o test invoke.c ./libmyso.so : W1 {2 J+ c6 a
6 o- t) ?; s# U, v- x! Y5 v
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
, @8 x- a1 T! Q0 e& ]3 m$ {5 l$ F, x# C& N
测试输出结果如下: , D! h3 \  N) E5 V, i
1 D2 I6 v1 {# X- j8 R: ]4 S2 d$ @
$ ./test ) n1 L$ W! q2 V. D: m& V4 _
, E5 H  p5 Q8 ^! t
Invoke my so
3 m# o* G& E( r3 L9 y! h
) D& W' u3 J6 M& IStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 11:17 , Processed in 0.035011 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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