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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
# M# `' u+ V. J
% p$ j( ^0 B. H#include <stdio.h>
- L! Q7 L- j3 |8 o- l4 c( _" n1 k/ `5 F1 A
void show()
8 h% [9 L7 B! _& ?: Z! j! t' ?0 k" c{
8 K) {6 X+ H7 C, M    printf("Standard Object by gashero\n"); , d9 Y5 x1 K1 O
}
& d: W/ P* k. l6 b6 b8 q% [6 p7 R- t, b+ V2 C, |7 i; y
保存为myso.c文件,按照如下编译: 8 l( l) V" m; Q" A# l. \- C! m
8 ~4 }$ g- M5 s! W* b5 n5 d
$ gcc -fPIC -shared -o libmyso.so myso.c % m' v2 P+ M) G
  t, {5 F: i9 w
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 ) F3 M+ i8 K" M/ z  d
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: / b, T4 Y0 i" q/ g4 S$ c2 b# R$ n
8 ]  `+ h- [( r5 p
#include <stdio.h>
' @- s+ d; t+ Y4 Y3 R; A
$ |0 Y; W  h1 \+ S( xint main()
# r9 c2 r& G6 \0 Q% @* ]. e{
9 H0 ~; d! S6 d" H- A   printf("Invoke my so\n");
5 L# m6 `' Z! B4 a7 _3 J# n   show(); ( L) _4 n  P6 f) }! F; `6 V
  return 0;
" r/ {# w: S  `}
+ Z; @  R+ W( C$ V' u3 o" e: [
* f3 s- }+ W( @% P% z+ l$ j2 a2 c保存为invoke.c,按照如下gcc开关编译:
, z& f; S/ h% v/ N5 z2 g: s( f
! H- A* k# x" z# x, d1 }8 q" ?* K" _$ gcc -o test invoke.c ./libmyso.so
( R& I) Y% n5 ~) Z2 y% Y9 f2 j) p) {
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
  {& [5 F8 m( F5 _$ d% P' C. F; E3 N* C0 X
测试输出结果如下: & E, [2 I2 p& x8 R8 b2 G5 o1 _
  d- w8 t* x2 t
$ ./test $ e7 U  k' o) [/ ]- q
2 m$ a9 @7 X; X" Y) `
Invoke my so
& ]% V4 `5 L2 E8 A
% ^& }) F' X- z1 o; jStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 12:02 , Processed in 0.018935 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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