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

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
+ p$ y0 ~( m. r5 D+ J& `- M/ K1 _1 \5 R* f% ]; A
#include <stdio.h>
  m- L) [  K9 n5 Y6 H7 v0 Y
" M" F# h; x- W) evoid show()
* ]* P$ L, s; |{
* T. Y. M% V$ ]( S    printf("Standard Object by gashero\n"); ' d- r# g; b# N' ~# Z: D9 g& W7 [
} & w/ d' n+ H2 }+ N! X( j

7 u' [- @+ F0 W3 i, f5 E保存为myso.c文件,按照如下编译:
+ c* a* v5 C8 w4 b& V1 Z: d1 X, J! O  n7 O; u
$ gcc -fPIC -shared -o libmyso.so myso.c
% r3 H0 T0 p$ n- C& `, B! p" U& A+ v0 u9 j6 L+ V
  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
  @% b/ t( ^) f7 ~: U  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
/ ~0 r4 C+ f! |/ H8 U! w
8 f9 z! d" \) `, S* a, l#include <stdio.h>* ?7 f- s" x# |  x1 l4 g, K  x

/ j) k" p# V9 k) E' ^int main() / {: N$ C# I1 {* w) _1 P
{ ; @4 i4 O0 {6 K( S, n
  printf("Invoke my so\n");
3 }/ W  ~) `7 [% T) J! x  C   show(); $ @  R- [# O; z8 D
  return 0;
7 O' o1 ]9 v* B4 ?2 L, O  h) i& K}
/ `, o! s7 F5 G" {  u; }' V
8 i" e! A0 J1 }" T保存为invoke.c,按照如下gcc开关编译: $ k5 ]! u) \$ G  X6 n
+ Z5 e1 e2 F+ z* H# \* p
$ gcc -o test invoke.c ./libmyso.so 8 W3 x) k  X  ]' S/ H5 X+ w6 p

- a- r; t1 ?. C, C- ?, r- K( Q  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 , Z6 c4 J6 O; b3 D% r
: E+ o  r# o9 s& {" Z7 n7 c
测试输出结果如下:
5 y. l& [0 y+ N  u7 E9 `( W
, B& H( E. {# U2 @5 p1 I2 b6 V( g$ ./test
1 k1 v/ _; ?3 Y  C: G; X4 V0 w4 B' X) g) X2 }" J. @# j
Invoke my so 7 d0 D# b  g' Y
" X" P; y, e( T7 M! h3 |7 C
Standard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 06:39 , Processed in 0.017853 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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