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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
6 P+ s  m* o: |* P4 r6 Q2 `6 d" m+ J& s' j( H
#include <stdio.h>) P4 i3 z8 q5 W

3 S  K, i: K( e2 n* F. X+ O( ~void show() % Q' d9 H1 Q- n- Y
{
" P/ @' Q1 _8 V1 _& w    printf("Standard Object by gashero\n"); 2 f$ F- ^: Y  K
}
6 Z, [$ G' x$ c9 Q
, _4 ^, \: @2 S; ~0 n1 P6 T4 [$ q保存为myso.c文件,按照如下编译:
1 _" I+ _; j5 W9 C! w+ v6 l
# P: [; G1 K- }$ e( l' s0 Y/ m$ gcc -fPIC -shared -o libmyso.so myso.c
6 ~6 T; r8 @1 ?6 H
9 V  F2 H" d/ A2 P' P( J  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 % Q, d$ n1 T$ ~) b- X: D
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
0 i- O, ~' m$ _4 J( a3 O" m: a
/ `' ]  Y8 u* T$ y#include <stdio.h>! M' Y% F% V4 o( n
  ^9 \% [! T% {0 l& }
int main() ; d( _$ [& u0 M$ J- u' s5 j: t
{ " h" ]! h( s5 p4 M
  printf("Invoke my so\n"); + Y1 K" ^6 g" a
  show(); ( U) ?( |8 U/ B! r# N
  return 0;
& [1 J* i; S' }  M! q  o} 0 ]: E/ h% Z( T4 ]! I

2 r9 D; q" y: x* a保存为invoke.c,按照如下gcc开关编译:
; r  B/ |1 u9 q* `2 g' @
, C/ Y" q; ]+ u1 D8 u5 N$ gcc -o test invoke.c ./libmyso.so
; _8 t! \( M0 g' d) u" T4 d9 Z8 J0 b, f
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
1 E0 v- }0 a! F8 w+ w
! w, |6 C- ]: I1 B6 Y2 m- u测试输出结果如下:
4 F$ h9 }. S1 a! z& e  D+ \+ a: M4 ~( P
$ ./test # N" s2 o1 n: F* X" p

( M+ Y& a; M7 d, i) f. NInvoke my so 6 j1 P* M7 C3 b

% ^. K  _' y% n; H6 Y$ h7 b; O& w0 ZStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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