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

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

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

" `1 n" h& {4 X9 F3 C' X#include <stdio.h>1 S5 Y- @; H: C: s
" t8 O6 j, \" `
void show()
8 Q; ?) ^8 t+ @{ 0 A. m( [' _0 e3 i: g4 T, p
   printf("Standard Object by gashero\n"); 9 e0 j  L9 `( l& S
}
$ w& s1 ^$ ]( s. _3 w/ Z# u) H+ e# k6 s0 C6 ^* e. m5 C
保存为myso.c文件,按照如下编译: / E1 I% S' y& q* m

6 h9 D2 c9 d9 r" x: o" e$ gcc -fPIC -shared -o libmyso.so myso.c
5 n0 v* [/ F& H6 ?: {
! P2 B9 d  p: x( b% J% s  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 / B7 Z. G! C  Q# W( v6 @
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: , w, a: V. P* p; B1 q. r! X
" p: ]! q! `! ?/ I! l
#include <stdio.h>
5 e+ H0 R* k. V$ D. `# B0 V) _  M- _  w
int main() , ]5 B* V0 g9 x/ M  a# y
{ 0 Q- W9 B* i; c0 S
  printf("Invoke my so\n"); 8 q9 o( B2 O$ Y$ Z9 y6 U  v
  show(); $ v. L6 I$ d2 @$ Y8 a0 e0 F
  return 0; ' S# w, e9 M' s4 ~' T& O- Y
} / b! o2 V) U) W

+ w& [/ J4 k5 D0 ?. P保存为invoke.c,按照如下gcc开关编译:
4 }, d$ t# p; U4 o* C3 w- W+ J% [' a& |1 o+ H: L' S
$ gcc -o test invoke.c ./libmyso.so 2 U  q+ r/ T9 r/ T$ _; w

, \4 u8 ^# l) b% v8 ~: y  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
; B2 W3 E( X  |  ^% C3 |$ ^
+ F1 |+ b! ]* i1 S# [& U% @测试输出结果如下:
- X- j' U& x7 {* I; Q2 T
2 f3 [) I! W& T, Y; {1 Y$ ./test
, Q+ j, b6 Q$ k  T1 r
9 T. o3 X, M$ C5 J7 h# JInvoke my so
' _# B  g. H0 j& H" V& V3 y3 `, M% Z* Z2 m- @
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:08 , Processed in 0.014011 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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