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

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

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

' e& Y( s' b( A3 a#include <stdio.h>
) w$ c0 K  R& L. p* _$ ~7 |) M; I( p) y" y. @- d7 V6 ?
void show() ( {  K, j4 m2 m8 U
{
, e6 ?' E+ g) |; J7 Z    printf("Standard Object by gashero\n");
9 i! K6 S: J. w3 N- N. Y}
6 T9 [' A3 V9 O& A( b/ u  j- x2 y+ L; s. _, }, A( ?/ M
保存为myso.c文件,按照如下编译: & r2 }, o( m9 C' z5 t

- N, A: g) X) P! {9 u$ gcc -fPIC -shared -o libmyso.so myso.c # a- s- e& s# W! p! T% o
" `. o' E, \: o( @- _3 J* q1 j
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 * U: O0 ^4 f# q3 ^( a0 a; O
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
) O5 S$ @1 L# F! {- l1 s: a( g* c- Q, a( N% p
#include <stdio.h>
9 Q* ?* {5 f  Y; K7 |+ A( J4 O9 u0 @$ O: M! F9 L. Q
int main() ' Y7 I  j4 O* E2 N8 p4 F4 E  ]
{ 5 V1 G1 C, {4 U( x
  printf("Invoke my so\n"); 1 t( q" H" M  W8 O
  show(); + F$ z/ b5 z) O3 u6 o0 K
  return 0; , Z7 V. [6 M% g! r- L
} . s0 F) L2 r1 u* [
' C$ r$ v3 ]+ [7 g7 Z" M, P
保存为invoke.c,按照如下gcc开关编译: 4 |& c, |4 b" c' }$ |  J; t

  g/ Y1 B9 b: E$ gcc -o test invoke.c ./libmyso.so
! L# ]) J; l2 z5 Q+ ]+ e" Y. N/ I1 T, t# [9 m( j- u
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 ) }3 B9 n  Z$ ~, p1 \

" T! e4 a# d8 z9 |$ t  n) A测试输出结果如下:
) B+ ?6 S2 S9 b7 d$ I' a8 P; V. b4 _8 T
$ ./test
4 z+ X9 s. @! N! \- o+ s7 M$ b  H3 a# R. Q+ c' p
Invoke my so 7 L3 @3 @8 }$ V- O3 c: a+ z9 G9 L
8 K+ J1 |! q# X: E
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:13 , Processed in 0.042474 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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