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

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

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

+ T" F  c( {1 u- Yvoid show()
$ ~- l6 w" l! q{
/ W0 K6 L8 D/ W+ Y    printf("Standard Object by gashero\n"); $ B! N' G, D% `
}
! k# x  M$ b  w8 J5 Q; p7 _& k9 W( Y% d, T; A
保存为myso.c文件,按照如下编译: ; t+ @2 w9 ^2 i5 p
+ w* a4 F% f- V% l; j5 z! g( a
$ gcc -fPIC -shared -o libmyso.so myso.c $ _4 p! |( L/ C- l' J
. J' e- [% q  }4 S) a* X; ?0 i
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 / g8 v- P" l0 [. H  d$ C2 D7 ]
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: ' V1 Y) \/ {/ @8 n/ _) u# s6 c
* p2 }  s, G4 Y: m2 |
#include <stdio.h>
& H$ {/ Q; d: K2 ?) R% F1 r& R, I% V+ z
int main() , A$ p# v% h2 a' w# U
{
: r, x; n* d- Q# [: d! {* K1 d, Q   printf("Invoke my so\n"); ' d8 ]* d5 X- M8 o0 B2 R
  show();
8 G5 N! z, C5 W: ]+ U; W   return 0;
2 ^$ J9 X: [/ W$ b. X) J9 p9 U}
% w+ m; ^/ f1 \5 a+ q; _& j- w9 N" ]/ Z& R  J+ z4 ^  B+ Z2 m
保存为invoke.c,按照如下gcc开关编译:
. D+ `# u, o) p2 m, @2 P7 ?0 V
- ]+ A" @: @+ R( a( l9 b$ gcc -o test invoke.c ./libmyso.so
" c5 ^% u+ j) g" X' {+ e
, O1 X. J$ {7 V. H/ Z8 Q  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 & c% x! k& O. ?! Y

+ N- v" y. H0 ^; d: y. B2 w测试输出结果如下:
/ C' Q6 P1 X& x) b! c7 Q0 C- N, n. x' S
$ ./test + k& a  U- E$ ?3 ~2 R3 Z
, p0 h8 i- j6 ?( b. ]0 F" D! \
Invoke my so 3 r* M; e3 o& s: O3 z) d% e
' y8 U/ ?  F. D( q
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:41 , Processed in 0.016417 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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