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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 6 w8 K3 J. @5 N+ [; M
! A$ W) T. E# A0 D; x, m; W1 ?
#include <stdio.h>7 X1 \, _& `& S" R
4 }  U5 }) e  I/ P5 `" q1 f/ p2 F3 @
void show() - U5 h2 L+ d0 M  T
{ 4 ^( A0 Q$ }" x2 O: n9 l) t
   printf("Standard Object by gashero\n"); 8 i( g2 d6 b  ~5 |  t
}
& L: Y/ R: ]. @- @/ G6 b! A" ?' k
* B5 H" Q  N) [保存为myso.c文件,按照如下编译: # C# c6 ^4 t* s5 d* s: l9 L
+ I5 G( T: Z9 W: U! P, O, F
$ gcc -fPIC -shared -o libmyso.so myso.c 9 K6 i4 Z% _  j1 X  d8 k$ P

! j7 \) j, k5 U  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 & Z, @/ p9 t  q" S$ i
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
3 v5 D. ^) A" b7 }- u: x5 j. G1 j+ u7 x
#include <stdio.h>7 Z' o# g! D( ~. o4 f

2 I5 K8 A) K& d) v" c$ L8 J- tint main()
2 S; ~" a1 s. e5 N6 V{
9 Z1 g4 o6 l  F5 ?# z6 Y/ g   printf("Invoke my so\n");
9 J. C% S: d2 V( U   show(); - I& b; H: G" N- q
  return 0; # K- {* B& k5 u/ \( P6 Q6 X' z: B+ P
}
6 P6 A" N- H3 g. B4 ?; q7 j5 k
3 [; N  o6 C, m9 C) A保存为invoke.c,按照如下gcc开关编译:
% R# ]+ u' l9 ]2 C* L2 V
. `9 P8 x7 J: V4 B* T$ gcc -o test invoke.c ./libmyso.so
! a7 N+ i# h4 I$ t4 d/ `' q9 M% F: F  {% L% L9 p
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 6 e- r% U! E" Q8 [$ Z4 _. R- F

# |1 `1 {8 i) X# R测试输出结果如下: 0 _5 r6 J5 m) b8 T1 q) G2 W2 t# `: R
6 ]5 M( U  V' q5 U9 r
$ ./test " Z5 `5 L1 Y/ L, ~, k& g

0 O# {$ o9 x- |Invoke my so
& g' c* Z' H0 j1 O! j/ ^- [3 K9 ~. A4 V9 l
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:58 , Processed in 0.016428 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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