找回密码
 注册
查看: 5056|回复: 0

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

[复制链接]
发表于 2006-11-14 15:21:26 | 显示全部楼层 |阅读模式
    动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: - _2 Z8 E' Z4 M+ g; ?( g& h) m/ \
2 e2 Z& q8 k; x5 l( p/ b  M
#include <stdio.h>' ]- u1 D; B/ N/ t5 W
8 C" X2 T; U; m& a; U5 q
void show()
9 G, I* D& J6 d$ j{
. m* T5 T2 w0 a0 Q$ Z, ]5 C! [! U9 C' l2 _    printf("Standard Object by gashero\n"); * Z7 G8 {, {, V" H( j
}
" _. V* L# P9 \# G
2 B& W1 s1 ]4 r' J保存为myso.c文件,按照如下编译: ' \+ o9 H! Q9 n, t( O
# }/ s/ d8 _4 |0 T. ^& {' ~
$ gcc -fPIC -shared -o libmyso.so myso.c
  k: F% `. f+ T4 s% E0 q& K
4 _' o( [; {; M! v2 f  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 & E8 ^2 M! m. h7 v. O( v# M5 j
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: ; P1 A4 c  K" W2 r
5 K- w2 g3 R+ ]  J2 |" C6 s1 Z
#include <stdio.h>
6 @6 @0 k: {' B. a; [# w" J6 j8 v+ m
int main() ; ^9 c. w, ]: G! u& D
{ 1 z0 o+ x" T; W1 z
  printf("Invoke my so\n");
9 A# a, Q  q0 f6 p  R! c& c   show(); - c* x% |6 w4 L7 q! F5 y1 D! T
  return 0; ' `" k0 q7 H5 ^. o" S
}
" D& x- i1 c6 f/ ^6 a9 F; }1 V# A& N5 L
保存为invoke.c,按照如下gcc开关编译:
' q2 m) t# Z; d
7 I" S! G0 X2 v* y! O$ gcc -o test invoke.c ./libmyso.so
9 K1 F  U  X2 ]2 V$ c! [) ~& C& R$ L
  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
/ _% h/ C$ k5 |* |  p) O9 x" \) S  C( n0 A! p# Q
测试输出结果如下:
7 b! b2 K7 \. L, G8 V* }& Z
  F) t, P: y' ?) t$ ./test $ r* ?9 t! j4 b8 X( g$ o

! _3 q% m0 z+ Z4 mInvoke my so & \" z" D% U3 n  T7 U8 V3 {  @! ~! ?; X

6 I( E# N' g) PStandard Object by gashero
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 00:29 , Processed in 0.016433 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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