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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
# Q0 h! [: x( M: V, q
; Q7 @+ y# A2 \5 [6 U% Q#include <stdio.h>) M# l5 H# s8 a) P. m

3 r% q, H! {, _" R! Q( e! Xvoid show()
  g& H6 q4 j1 _! q* i, C{
' Z; ^; ~) T% X. ]    printf("Standard Object by gashero\n");
: E; Z) t/ n5 o}
, W8 W' J( a: V7 U/ i0 }* y
' m/ _. }; U" ]# C保存为myso.c文件,按照如下编译:
! ?/ E: O1 }  Y
" o+ A" I5 W1 t3 H. R. ?$ gcc -fPIC -shared -o libmyso.so myso.c
( u0 h' e7 {2 ^0 B
, u9 L. |. C" K  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 , {) j& O4 V4 \' O. p9 |
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: ! y8 U$ e# q+ X
) t8 }, H3 h' X; D7 u1 B6 W& b- s1 W
#include <stdio.h>
- P5 l( G9 y- ^; F1 d
- s& a$ ?5 d  T8 ]" C$ zint main() ' K, \+ P+ ~! X
{ " r1 @& _. A9 C, \9 w. F* w
  printf("Invoke my so\n"); - o" g5 ]& G+ Q  J% |
  show();
" u4 |1 a+ r" \0 z7 a+ U   return 0; ( D5 A* j' k! z! R
}
! g0 g6 Y! J! K# r/ ~2 w9 `# w( t1 _; p) v
保存为invoke.c,按照如下gcc开关编译: 8 u# l" q% ^, a9 O3 ]6 B# R

; ]3 n9 {, e" J" W! G7 ~; Y$ gcc -o test invoke.c ./libmyso.so
- T3 m# E& F. T; N0 X& x% b" O9 V% R1 U. s
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 $ s$ ^6 \' i: j6 j% G( W- v* l6 N; p
9 H- r; j+ I3 B% ~
测试输出结果如下: ( H, m% H. ?8 h

! U% I& X1 w9 F4 `* v$ ./test ; y4 r* b$ D7 D' `
( r8 R8 H: V) y* _! h$ W( g
Invoke my so ) ~. M$ l0 d" i

  t6 E, V( @; s# t' UStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:20 , Processed in 0.018376 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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