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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: - M0 L4 T, X6 z) s4 K
3 K: J2 G, b. |" y+ u
#include <stdio.h>
  L+ Q2 F4 b: N* I0 W4 d. g: i6 e# E' _& D
void show()   h, O& s% v" M& ~8 u8 X$ u% c
{
7 |8 a" ~' p+ b0 h2 f    printf("Standard Object by gashero\n");
: m' d1 [7 ?) f. c9 [}
6 K0 m+ j) c, ]2 ~# {( f9 L9 ^
+ F. z6 n1 V# _* J6 N4 w+ z! i1 Z保存为myso.c文件,按照如下编译: 4 t( t. R1 O6 I: A- T* a7 y
! G5 U3 A5 G$ y- ]
$ gcc -fPIC -shared -o libmyso.so myso.c
0 {5 y& w. O8 K& N7 K4 G# o" U/ N$ ]( P9 }
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
- d+ h' k1 N+ I& D% r. R  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
6 k0 i* K5 ]6 [3 j0 b
' z" {+ G  Y( w8 r/ R6 E#include <stdio.h>
# d$ A  `; y3 B( f. u7 M
" P) o' d) d' Y* xint main() " D# }) E, v( ^6 b
{ 2 h% M& f+ a% H  \& G" h
  printf("Invoke my so\n");
6 _# h$ X: l* j$ L   show();
5 _9 H# N* V: j$ z1 U   return 0; 5 A! y' J9 @# C$ O
} " o* N; t; G. I# s5 v6 H* D2 G
3 |+ b; K' w1 P5 z" Q, N. M7 G( I( V4 Y
保存为invoke.c,按照如下gcc开关编译: % B% m4 ?' g0 k# W

" q* D' ]" J( W2 g7 T$ gcc -o test invoke.c ./libmyso.so , Y! F5 F0 P* p( T: c7 b
) O, y! `1 N" L4 p1 ^1 D
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
( J: o( O4 M4 q0 C5 W$ N) |2 T8 @6 x9 M
测试输出结果如下: 9 r( a: f% ~& o7 z8 K

5 J4 B6 ?4 M4 c: Q$ ./test
2 P* b7 k) }6 S
) r6 C' E+ b" L% iInvoke my so 1 }- L3 M+ e9 r8 W; h) N* h
7 P' S# v1 L) f3 k2 h8 i! X) j6 x
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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