|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 ^# P; l3 j/ R6 Q" d0 W
静态库和动态库的设计
5 L( b, W' w9 D7 S! ~ e5 k
! ?6 I' m# h8 r5 I: j$ T2 A1 Q$ n V8 d$ R% u" A
Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供* ?# {* F- L6 D7 H2 G: {! ?5 h
( y2 a; ~. e: v6 y
2 U1 \& }" Z5 }: nLinux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库(空间占据大)
' f9 g, E! q" Y6 x, W# W* }
) O B. E+ E# X M2 X# w. K& s# G0 j: b
Linux下进行链接时 默认是链接动态库( L& E# |; }* P% {1 |6 j* j7 w) ^
! \0 F: P1 }5 E6 ^& M5 Q% @5 v) ?0 |* ~$ k9 \. J
1、制作静态库- n. L- d7 \+ ~$ F# U; h* h5 c- o
# g9 H" _5 G/ l a; Z7 |* V4 k }3 h8 W, s1 t z5 M
(1).gcc -c mylib.c -o mylib.o3 ^: } |) B/ T4 D/ \. y) f8 J: t% u
( ~6 x3 B/ b( Z8 \
+ Y8 u4 U- P# n L% U0 V (2).ar cqs libmylib.a mylib.o, ^& ?$ }( D d4 V. }
, ^& F& K; N' r* q: s+ H0 a5 H" B
/ P( X% ^7 A5 ]$ U. ^6 V (3).将制作好的libmylib.a复制到/usr/lib( L* v: k# Z5 m- x6 Y) j
t' r7 w) O& z4 u V5 Q: t
' f: m/ [: D$ h$ R" e (4).GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。例:gcc test.c –lmylib -o test& w E7 i8 q" U- K
& }! r/ s* @+ o5 u u
! y5 O) f9 t- v$ k8 z9 Z: n
6 \% q9 _% y5 `. O, g6 r# ~2、制作动态库- b: i& q/ f& A: u: @/ y
6 [; [9 ]- J, u
6 x; w6 g# ~3 L0 X- I; G
(1).gcc -c mylib.c -o mylib.o
+ j6 ?) T7 ^% U& Y: l" L. c9 W( D! Y6 j) f
8 s$ i4 m. P2 f6 @( @ (2).ar -shared -fPIC mylib.o -olibmylib.so
4 D& B% y# f" Y2 i4 o! @$ e% E' C9 f% W% @% O- H
: e$ R! Q+ H$ y" S& m' F (3).将制作好的libmylib.so复制到/usr/lib
& C1 u$ T. O4 |) h/ n, d
7 `- C) D! V/ R4 u! F5 z6 S
8 E. |* l( F) l6 ^3 l g8 h5 \0 ~ -fpic 使输出的对象模块是按照可重定位地址方式生成的。
8 g2 z3 I' P' Z1 z4 |, e* J# L1 n; m. C9 Q
: S q2 f% |; g- n
-shared 指明产生动态链接库
# ]0 ?3 y+ W) v2 f2 K* H M e. p$ j6 y3 n/ {+ U3 t; ^
4 x0 J5 U5 I( F& ^, ?' s4 `& M; p (4).GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。例:gcc test.c –lmylib -o test
! q. u5 J' U4 c' Y* D) @
0 ^8 l$ J7 h+ h& n0 T1 n' F; N) @, Q5 m+ g- m+ b
, F0 I$ j# g+ W7 I5 ]
. D/ w& v: B9 `& J7 N6 P$ U7 E9 f4 J+ A! I/ y. K
3 {4 h! W9 e. \
& h* Z v7 _- s6 B; N7 k, r7 j |
|