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

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

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

/ R# }6 H! {# V/ A) ~& Q/ M( C9 N#include <stdio.h>/ t( i/ Z* t! c9 r

2 `0 E, x6 m) t  r3 x& O" Zvoid show() ; ~, J8 S/ N, K
{ * D! R1 j7 a: [
   printf("Standard Object by gashero\n"); $ |7 I' n3 m( V7 L0 H6 P9 ~
}
, p5 e" g( ?8 g& \4 B1 W- B" J' }( l1 a$ @' i) g; |* c+ t) z
保存为myso.c文件,按照如下编译: # f8 K6 n4 w/ b8 ~: Y+ Y" C

2 j* E" y* g" P; F! ?$ gcc -fPIC -shared -o libmyso.so myso.c . j  R* a3 S% f

2 J  K, D7 n$ G. |9 N% m  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 5 e( S! e0 R6 c( r
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
* B" L! M: t5 k4 L# @4 `) l+ ]0 ~  I* W0 ?
#include <stdio.h>1 L( Y1 _7 I, A! v) K* O* ]
' U$ O3 u4 v- h5 Y  `, ?9 t& b
int main() % s6 B! J8 `- D1 d8 A
{ ) F# H: b+ D/ Y. O! N" E! v
  printf("Invoke my so\n"); ) A2 W1 ]% n5 M; C
  show();
( h# ]0 q  v5 }: i) W   return 0;
  o* i; O# Y% N# E8 I- h} ' @/ I$ ~# N% ]2 T1 E

4 P* s( B; i3 }6 I0 f6 q: J保存为invoke.c,按照如下gcc开关编译: 4 S/ g; T# i$ u5 s0 O6 ~  ?

* K1 m. f0 d1 ?) }$ gcc -o test invoke.c ./libmyso.so 7 F$ c' S3 s1 m: V: r" ^
& r/ ^4 m, J5 }  c$ T4 z0 S, F% [6 Z
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 . J2 R; I# m$ [# a' }# B
; R4 D& I! W" B
测试输出结果如下: - O$ y# R: w" k' t

; T9 P& w& }5 i  n$ ./test * y% M9 v+ h3 X4 Q
9 X8 S" Y: U1 B; g+ ]5 }
Invoke my so
- t1 f6 q" \& R+ ~% o0 Q" h" _6 j: ^3 d9 C1 d0 j
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-20 05:26 , Processed in 0.036059 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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