找回密码
 注册
查看: 5057|回复: 0

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

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

, B5 J9 `) I9 U$ |#include <stdio.h>8 g8 j4 l; b5 K4 O6 W& R; {3 ?1 k8 D9 `

; e! H9 w2 U/ {3 T$ a& D3 lvoid show()   l* U% o5 q0 K$ {) M5 }
{
- N- B' X" X3 W$ a    printf("Standard Object by gashero\n"); / {/ m: {; O7 B5 C
}
) H1 v4 A5 ^+ C
6 N. K: r4 O# T! `保存为myso.c文件,按照如下编译: 5 d$ C/ f) H9 S! M* g
' `9 J* J5 s' X0 [( ]; t7 ]
$ gcc -fPIC -shared -o libmyso.so myso.c
3 T: k  [( V( x9 q) J
6 e( d9 ^' l# y1 T6 |  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 / D" |7 d* S1 I/ u! g1 u+ W4 f
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: : {$ q8 _& |0 m8 ^9 r

+ p* Z! A* D* T# w  |- z3 e) L- Y#include <stdio.h># x% S; h' O6 r' f/ J; T

% X8 ~9 d2 v- S; x& Xint main() 1 \5 u2 a1 m4 a* [3 m
{
7 }. i" [+ z" ~, g7 z8 r   printf("Invoke my so\n");
# ^; z& C/ j/ P9 o9 k; G   show();
2 {/ }1 s- ~) S* e   return 0;
4 P8 e2 z  x2 E5 S  G# \$ D}
: _/ I- \4 E6 W6 U
& k4 X7 X, X. t& [* w9 `保存为invoke.c,按照如下gcc开关编译: 1 x8 ?4 m# X$ I
2 e$ n6 J3 e! \2 y- h/ V
$ gcc -o test invoke.c ./libmyso.so
0 J; S7 x" E! M3 ^1 S
; k' R; J% _# r* C9 q  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 9 O1 i" h: U* M
4 [  O, }' B5 B( ]
测试输出结果如下:
  d$ U  Q1 F& L' F( P
1 Q  r) s% g" ]1 J7 R$ ./test
% b8 i2 ?/ W! G0 V3 r% @: D; v
: C5 M# ]2 u  b* uInvoke my so
! P6 s; c( r! y  t! n. d
, e+ ^0 ]; H7 z- N( @) P; F8 c" XStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 03:26 , Processed in 0.015643 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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