|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" U3 R9 l0 K) D3 | \9 u
静态库和动态库的设计
. d$ W) s# P' i
% u G+ q' ?- r
2 j3 S' D& m& ~, S; J' }, QLinux应用程序设计中需要的外部函数主要由函数库和系统调用来提供* M1 `) x# i* Z5 X! a+ w) m% b
( v3 k2 ]& q. m5 H" |) m0 _1 \& ~; E% _, c% O( M8 @
Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库(空间占据大)
3 o. X2 P2 U: O( ~7 `5 [% u. ]7 U) u
2 [' r* f, |5 D3 ]) [, K0 {- } }5 b
Linux下进行链接时 默认是链接动态库( g% C. @$ ?6 t
0 S$ G+ O$ z9 C9 [4 p" R9 R! @" c% [
1、制作静态库
# t; p& o: B& Y+ v) _. U
6 o/ v% k+ P* {5 W+ k
8 E b# r Z- l (1).gcc -c mylib.c -o mylib.o
) G1 a$ a1 Z; @* @2 j3 b. E. J/ U1 _0 ^
0 R" u6 o9 p; W7 {' O* M9 k
(2).ar cqs libmylib.a mylib.o
9 e/ a4 c2 d2 V+ j5 X3 [. X* {
. V1 o7 u! u; K# j2 E" p1 P; A$ c( z0 ~5 { g, s
(3).将制作好的libmylib.a复制到/usr/lib2 D- Q; G" n; b( z& E0 V
! h6 S8 } ^0 E) z
$ g& k5 R% p: i6 E* B: f* ` (4).GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。例:gcc test.c –lmylib -o test
$ \5 W; ^ ]9 X W% I! C- U& g+ V1 P `
# w% u4 e* |3 c3 N B0 _ c$ y U; l3 x* j$ Y" l3 C7 q7 K
2、制作动态库
) a/ ~6 {( H7 f d# ~* S
$ W+ V3 N* i+ z
, m3 T6 @1 h7 [: D5 x8 m (1).gcc -c mylib.c -o mylib.o
4 l4 L5 _- i9 p6 S) r( `. `# | G8 [- _: L
- P+ m8 B5 V. S9 c- ]6 N5 ]& g1 F (2).ar -shared -fPIC mylib.o -olibmylib.so
; j" L3 @8 `8 \( X8 w, f, O# X8 Y' x: @. T) K
, }( j; e2 V% k" }% [) ~; I
(3).将制作好的libmylib.so复制到/usr/lib! h) {+ ?( S; N# m, O
5 V! L8 v$ X4 v. I9 R) z' V" e# S
" W! ]+ F' E4 w. a# e5 l ^
-fpic 使输出的对象模块是按照可重定位地址方式生成的。2 F/ x& w. Q5 W' _
4 F9 |; d+ V/ i+ n e
d2 @5 d5 n" E, O2 L -shared 指明产生动态链接库/ p1 L. k' o, J, F% W
' e4 a( s, {" L) ]
) T% C* w* J; b (4).GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。例:gcc test.c –lmylib -o test
+ n/ V1 T" A/ b5 N8 D6 S
5 Z k' R9 E3 @! y, G
8 U |/ y+ k" _3 W( o, A. d
3 E% r( R8 H! f; [, Q) [+ S+ w f) c6 P" p" Z% y
g# Y" H$ { o1 x+ q( k1 i9 M- }) X( a9 l' z
# o) \* f0 T- H4 j |
|