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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
! Z  O8 E. a9 Q& J/ w+ V
6 ^5 E% N7 D; m#include <stdio.h>3 w& N5 V3 a# F, O

& V; p- R/ K3 dvoid show()
  x$ A5 j. p8 n/ A; j% {" o6 J8 G{
8 `6 m- y$ G( c6 v    printf("Standard Object by gashero\n");
) E! J2 Z0 L" M* ]" r0 P}
" E9 @# o# A( V$ O
7 L( q9 g% k) o' |9 t6 }保存为myso.c文件,按照如下编译: $ q1 j) R1 k6 C5 `- o0 w2 p
9 f6 v; P' \" e/ {2 j: U
$ gcc -fPIC -shared -o libmyso.so myso.c
7 X+ M$ ~! J7 P& b% m* T
! b$ B/ M& Q' i+ A% e1 n& s  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 . d# s& R$ ?% G$ U% p4 z/ h
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
, r2 I1 K& b. x$ t* W5 D3 H- s0 L7 M0 i) m3 N- F4 q& S( ~# q+ j6 I
#include <stdio.h>) A3 T# n$ q4 t4 D" i0 |* ]
( t3 ^: ~5 t) D7 g
int main() % ^; c& _& Y+ T' m& r4 F
{
  s# }7 D9 j, ]   printf("Invoke my so\n"); ) I; Y% w# [9 ]. D; u
  show(); 4 U" a" T' c: U9 N4 R$ G. T
  return 0; * l2 p% i' B/ b- U: s
}
( l- Z: y- S' i( p, ?  T. B& U* M9 j) W$ L
保存为invoke.c,按照如下gcc开关编译: * h. \& n4 I# d. J6 c0 s1 G2 v+ }
  y; }- M' u: y% ]: a) q5 c
$ gcc -o test invoke.c ./libmyso.so 0 s4 z& l* I6 p  g6 F, {) X

7 T5 M* G0 v8 o8 K3 {, X# L  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
& F  Y# f1 j$ g' d5 m- P$ M0 l; s5 Q
& r, H4 r5 A+ d4 s) c  }测试输出结果如下:
5 w: A& Q$ o0 I: F7 j+ H- K! H. C8 S5 e  j6 R$ b
$ ./test
* ?" a5 P/ _# S1 Z
8 W- }4 O) w" M+ [0 ^Invoke my so
8 ]" _1 {7 d3 i7 S8 k7 I) F1 \1 j! c5 C3 W- z4 }
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 03:13 , Processed in 0.022447 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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