|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- Y) `" T, j/ O0 e* h" R6 a% ~! g, o静态库和动态库的设计
: J& j! P5 Y4 |. X+ u
+ B* M; ~9 D' h2 a* V' G0 E' L7 F. R% U- [7 r- b
Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供
- V, V: t v6 r; k
2 M' v) d$ m& E" h) y
v' M. h0 G& T" _Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库(空间占据大)
& Q2 F, f! `( d- d1 D) u, k4 V) B$ x( g6 z+ E: J3 M4 r
' g; C, u2 s1 W# {. Z
Linux下进行链接时 默认是链接动态库
w6 X- k' B. t. T0 S& p' h- d# { F7 ?$ _. _ e
4 k/ [: `0 o/ P1 Z: K# P6 @3 t
1、制作静态库
: ~/ k& f+ X* l+ P: _; _% C9 v1 Q3 D2 V( r
: `& f. C" w8 B7 N3 D8 H n3 t7 d (1).gcc -c mylib.c -o mylib.o
6 ^) ]" ^! b0 E! O. |/ ?
/ f+ ]1 T/ M& S4 N1 f
- \, e9 p: ~ u. O; Q& Q6 j (2).ar cqs libmylib.a mylib.o
" W8 y8 S. _/ k
$ x' ^$ V+ j+ z2 f% L/ d3 _" j! e5 z2 _0 E2 a9 }+ Q! }
(3).将制作好的libmylib.a复制到/usr/lib; i5 V1 x9 d c# g" Q' k5 [
4 v# g/ i" S6 N2 |) @: M
. B, Z: }' e, }& ]( C5 Z (4).GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。例:gcc test.c –lmylib -o test
& q* \! M( U h, S+ c. V# ^6 S$ e! f& X$ ?4 ~
9 f' R' c8 [; C7 g+ M ( r! t/ s' T' P
2、制作动态库( u5 n# K8 ^; M( r) R: z( w. b, H
# K+ l6 J M8 Q) _0 i% I, ?5 l! K; V! f7 S |
(1).gcc -c mylib.c -o mylib.o
5 g# ]0 x' v5 N
- j8 D& @$ ^( R' |- e* o& E) |. L0 J$ |
(2).ar -shared -fPIC mylib.o -olibmylib.so8 p: {$ v0 t8 B3 T6 E+ @
" Z" T( P% L! X) L8 e
$ j! R: f3 G3 {; p9 l' [& ~' u (3).将制作好的libmylib.so复制到/usr/lib
, h) k9 b+ D% v, ^. ? L/ D- n( q" C3 |9 Q- B8 J0 n3 S# o
* ]: [) s! L1 h3 N4 H" I: h2 D0 ] -fpic 使输出的对象模块是按照可重定位地址方式生成的。
8 h: |# g2 ?0 q. \0 W
; H5 c8 A) ^* o2 W; O9 Y( f: T
/ U# n$ q2 H" r: V4 B0 \+ c- v -shared 指明产生动态链接库
' d% f/ E, T. Q4 \: Z4 |7 u* H/ `
* T) a1 i% R; w4 c9 I3 l& I/ u& `9 S7 r# Z+ C- ^ _/ m5 H# N
(4).GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。例:gcc test.c –lmylib -o test+ \% h3 ^& O- z0 p0 Q
$ w2 S" m& {/ O1 T B6 M, P9 I
9 l& g( O, Y5 x0 G, C1 j; [$ ]7 z
2 q# S5 _! Q7 L0 R8 z$ D* l3 x
Y: \9 i; m" }& {6 A) E
/ f6 L8 g `3 F% ~7 G, p0 j0 k9 ~7 U0 H( O9 i! a1 _+ o; t' O
# z+ o9 Z8 M( p- g) b |8 g* x+ U; G
|
|