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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 1 ~% i$ {9 U8 U( \+ a( ]
+ r( I: a  a, @5 |* |* q; |
#include <stdio.h>6 N* _! W: W6 h' F

6 W% V" n! c4 h9 X! e0 ~void show()
* _7 t' A7 m2 ^8 D{ 6 a1 M0 v6 w  @
   printf("Standard Object by gashero\n"); 2 s9 f( f  S& |5 `( b& D: o& z1 H
} 2 o, ]  J  m- e! W  S

# P; _; [  H- f保存为myso.c文件,按照如下编译:
8 k4 L8 l( [. {. w/ I4 ]/ P$ U# g6 _2 a! i6 |2 f
$ gcc -fPIC -shared -o libmyso.so myso.c   W" s( x8 I2 T
: t8 I( o5 r- [  w( u3 O
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
5 z$ ]  _6 ?' i6 s; X; ^  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: 0 n: T2 w. Q2 J+ G
' ]4 T* f% n/ C, o
#include <stdio.h>/ O6 T9 ?% K# G0 X0 p
0 y. X% I: X2 z& s
int main()
7 b8 k" A/ L" `  p8 m$ x{ 4 _+ i( q1 p; z9 ]
  printf("Invoke my so\n"); 2 e4 w& K: E' e
  show();
/ [4 q7 N- G  M& d: D   return 0; * R' B& [0 \% b/ {
}
$ s$ _( c0 R8 |: X" L' m, |8 ?; J( a, J: g2 S1 l% b
保存为invoke.c,按照如下gcc开关编译: 1 @. {% v5 f7 h% W

4 X% ?! [) {- S. ^" m$ gcc -o test invoke.c ./libmyso.so $ _; g  t. M1 t3 \! |

, ^& [- d7 q' L# l2 T  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
  d, R6 x8 V( o: i3 Y* C
. X1 y+ l1 R2 j  Z7 P7 Q测试输出结果如下:
/ r3 L# m9 `4 A+ C2 z9 h4 v. A& u/ K' @, G" E! l9 l) u! j
$ ./test
7 \- M# i, D! G, q" B' v/ H
" l9 R9 \, e! h! d2 {; FInvoke my so - e# D6 a% M9 Z8 W  n8 C  |$ f# X
4 G' E$ {, ~' R7 ~# e
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 23:15 , Processed in 0.016524 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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