linux下的lib文件知识

随着Linux性能的不断提升和逐渐普及,会有越来越多的人在Linux下从事应用软件开发。这里笔者根据从事Linux应用程序开发的经验,介绍Linux编程库使用的一些基础知识零点网络Pgt$lvyleQ
零点网络/DJD` S-J3F9} B
库的定义和种类
#@X D3BsfE0零点网络 w0I+@o2@m,[
所谓编程库就是指始终可以被多个Linux软件项目重复使用的代码集。库是Linux软件开发所追求的目标,C语言就是一个例子,它包含了几百个可以重复使用的例程和调试程序的工具代码,其中包括函数。如果每次编写新程序都要重新写这些函数会感到非常麻烦。
'stPL6JO%w1XIrt0零点网络1Dx/`/'S A|gwa%I?
使用编程库有两个主要优点,一是可以简化编程,实现代码重复使用;二是可以直接使用许多经过调试的测试和调试工具。
(F8Uy3QI)`*O `3h]0
%/%Bn*Cn~1v,d0Linux下的库文件分为共享库和静态库两大类,它们两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
&gS`~_ v0零点网络(X'ExAn#I@
Linux的库一般在/lib/usr/lib目录下。lib是库(Library)的英文缩写,它主要存放系统的链接库文件,没有该目录则系统就无法正常运行。/lib目录中存储着程序运行时使用的共享库。通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。这个目录包含程序在链接时使用的各种库。


q'R Y[yy+s!i0库的命名和编号
VCa9Gk pt:?o IE9b0 零点网络.~-T ze0gU4hZ
在Linux下开发应用程序时,绝大多数情况使用的都是C语言,目前Linux下最常用的C语言编译器是GCC,它的全称是GNU Compiler Collection,下文中的库介绍都以它为例。
G.jw G[1l'l |{0
*i*pVPx| ?uL0GCC是直接建立在内核基础上的,是Linux操作系统外层的图形界面开发工具(Qt、GTK+)和网络应用开发工具( PHP、Prel、Python)的基础和过渡。掌握了底层开发工具,可以加快和 优化外层应用开发,从而达到开发速度和开发质量的和谐统一。 零点网络Q)~ ]x O*O2`x@ vF8m}2U

h1Y%u!C#W?U0q0 Glibc 2.3.2是最新版的GNU C库。它目前不需要修改就可以在GNU Hurd、Linux i386、m68k,以及Alpha系统上执行,并且从2.1版开始加入了对Linux PowerPC、MIPS、Sparc、Sparc 64等系统的支持。 零点网络+T E/[-BR

zB~.p&R8C6C*~I0如果想查看自己Linux计算机的Glibc版本可以使用下面 命令
[1s Ox/u O,~6/m-B0 零点网络drA4r1m w0?
rpm -qa|grep glibc
%O*h L#}8g u0glibc-common-2.3.2-11.9
I|pU3lD0glibc-2.3.2-11.9 零点网络1_+rq](Y6p4/
glibc-devel-2.3.2-11.9 零点网络x,yV+gw
零点网络M"qV*`7t
由上可见,Red Hat Linux 9.0使用的Glibc版本是2.3.2。
iI#r qUV5pW*]:/0
!B7So$B DD~g0 1.库的命名

1kGF3Z-u,n#c0库的命名比较简单,第一个特点是所有的库以lib开头,GCC命令在在 -l选项所指定的文件名前会自动加入lib。第二个特点文件名 以.a结尾的库是静态库。第三个特点文件名是 .so的库为共享库(共享库是在运行的时候动态加载的)。默认情况下, GCC在链接时优先使用共享库,只有当共享库不存在时才考虑使用静态库。零点网络poEY-Y t
零点网络D b _]2_/x
2.库的编号
零点网络 D$x|zQ
库的编号格式如下:
0J| M![qF0
%G?Ry_fk}0 library_name. major.num. minor_.min. pathch_num 零点网络f kA0`2M
例如,笔者Red Hat Linux 9.0的GUN数据库是libgdbm.so.0.0.2,详细表述如下:
[&t8gl5Nic0 零点网络/f{6P2s o P6tu/
◆library_name是libc.so(标准C库);
mcT T7{0 零点网络 rf{i3YiJ"f
◆major_num是2(主版本号); 零点网络n)kP3qQ4d/yn

/j;} {R1OM*^ m"n[I X0◆minor_.min是0(次版本号);
cGo6f;F5r4ql0
9r MHf]X;m5z M0◆pathch_num是0(补丁级别号又称发行号)。 零点网络T}o I1e
零点网络b%@?2e9`?y3D
libgdbm.so.0.0.2所在目录是/usr/lib,其大小是24576字节,这是一个 ELF(Executable and Linking Format)格式的二进制格式文件,运行时由系统将其装入内存开始执行。 零点网络DM2S5Gt_%jr
零点网络 w2pNIM;T0v
ELF有三种主要类型:
8`+}ZJO*@VD}0 零点网络}A)VM%]^%F
◆适于连接的可重定位文件(Relocatable File),可与其它目标文件一起创建可执行文件和共享目标文件。
%O*O%I_l g0|/B0 零点网络+NHDdx3d
◆适于执行的可执行文件(Executable File),用于提供程序的 进程映像,加载的内存执行。 零点网络6~pWq,k{

wsV:Om;~:[U0◆共享目标文件(Shared Object File),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件;动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。
%xf7If&i?.m;yg0 零点网络(y.d r"yCk$I(a1lz
常用的编程库
KS7j*bp2Zfl2M0
b]fB+z(cr0Z&R wb0库操作命令
DX3vV@7{ g-wB&k0 零点网络'f|!E qr
Linux库操作可以使用命令完成,目前常用的命令是ldd和ldconfig。 零点网络 UL(~2];f0? j
零点网络0{3b;Cxf-N#u2TI+]
1. ldd是Library Dependency Display缩写,它的作用是 显示一个可执行程序必须使用的共享库零点网络-Z-ykF9j"hN

` }vu"w h:q0(1)命令格式
F*@^ @9j#DN }0
~C,[v.F/j(C0ldd [选项] 文件名 零点网络;Mr4Fy:vz}
零点网络nxFX:u$pw,I+u9b
(2)主要参数
G~ a{ P'~Z s^|0r0 零点网络WkC|9P'n
-d 执行重定位并报告丢失的函数。 零点网络Ey!aOJB

Q^ JisG+@+x4W0-r 执行对函数和 数据对象的重定位,并报告丢失的函数和数据对象。
"k9X:a8HsF O(j~0(3)应用实例
(}0[;SzJ8x:^g5w0 零点网络-c,aR V{hJ
Perl语言是开发者喜欢使用的一种“胶水语言”(能够将许多元素连接在一起,因此它具有极强的适应性),如果需要 查询有哪些共享库,则可以首先使用find命令查询这个程序的绝对路径,然后使用ldd命令:
nM+z;GV5}0 零点网络 ^NW8b^3L

#i6D/|"wO K }%kk&F i0#find -name perl 零点网络+xB2r(rk?
ldd /usr/bin/perl
F+i2Aa'L`/p0
'H~Z3t)_7[&^.Do0
J o!h/ro[o'd0其结果见图2所示。图2中,箭头左边的一列显示的是Prel语言所需的.so文件名, 箭头右边的一列显示是库的真实库名称。应用程序链接到库的so名字是到实际库的符号链接。以第二行为例,最后的0x40014000是库 libperl.so的加载 地址。由此可以看到,运行Perl语言需要9个共享库。 零点网络6nd x'kO$gv'q"g

&WO8S} DL"ji4m#V02. ldconfig零点网络7XtmS1O%k

"^2@&eP;G6j)KGW0ldconfig 命令的作用是决定位于目录/usr/lib和/lib下的共享库所需的运行链接。这些链接保存在的Libs保存在/et/ld.so.conf文件中。搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的链接和缓存文件。缓存文件默认为/etc /ld.so.cache,此文件保存已排好序的动态链接库名字列表。
/}W1^WpC^0 零点网络 j gpR9wNA
(1)命令格式 零点网络k%[ rt4m

s_1g x;|5A$H;T0ldconfig [选项] [libs]
2/:b hRcegi0
n-K4qq-L[;R0g$D P4~0(2)主要选项 零点网络8~}b3`$P

;|Xl-N7Z1Wa4B0-v或--verbose ldconfig将显示正在扫描的目录、搜索到的动态链接库,以及它所创建的连接的名字。 零点网络)^F kr D0s$T

#I&|1m0{*/$[ ?}9V0-f CONF 指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf。 零点网络5Ud3tV/ k"{
零点网络!t1}5c CR%SH
-C CACHE 指定生成的缓存文件为CACHE,系统默认的是/etc/ld.so.cache,文件存放已排好序的可共享的动态链接库的列表。 零点网络QLz+|ey_ e%U
零点网络k$UU'zZR"W&D
-p或--print-cache 让ldconfig打印出当前缓存文件所保存的所有共享库的名字。
D"c8y Au{Q0 零点网络p(F-@Hr
-r ROOT 改变应用程序的根目录为ROOT。 零点网络z,Z7l2Mg qA q

N(B!^ ?yoG6F0-n ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录。 零点网络|2YOFn@M

#T/T/u {6R#j2F:w0运行没有选项的ldconfig命令时,用于更新高速缓冲文件。这个命令主要用于高速缓冲DNS服务器(Caching DNS Server)。高速缓冲DNS服务器的 原理是提供查询的 历史记录,并且利用这些记录来提高查询的效率。 零点网络&v&~ PH8L/x!F

o3L.] kD1Sv0当某个查询是第一次被发送到高速缓冲DNS服务器时,高速缓冲DNS服务器就将此查询的整个过程记录下来,在一定的时期内用它来回答所有相同的查询,从而减少整个DNS系统的负担并且提高查询速度。
,M NH2~:J @G)x0 零点网络.Wv!E*vG%h#n
(3)应用实例
4hc&e^t*`a0
(wM$NB A;k"q PU(h v0如果 用户想知道系统中有哪些动态链接库,或者想知道系统中有没有某个动态链接库时,可用-p选项让ldconfig输出缓存文件中的动态链接库列表,从而查询得到。 零点网络xWbF JU'rj;a
零点网络5VU"K0c{7T;w

l-s.~ e:VI z(}0ldconfig -p
c2Bay$l)Vs:x_0998 libs found in cache `/etc/ld.so.cache'
:W;L3idw+? ? @0libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
)P1]0yK2~C8{PQ0libzvt.so (libc6) => /usr/lib/libzvt.so
8YV zk`0A:g8~ J}0…… 零点网络,oEK7S%N9u ]
零点网络2Hi&?5w5L*{
ldconfig命令输出结果表明,在缓存文件/etc/ld.so.cache中找到998个共享库,下一行开始便是一系列共享库的名字及其全名(绝对路径)。因为实际输出结果很多,为节省篇幅以“……”表示省略的部分。
f cu(g#r:B0库的升级
w'],f txrT&Y2{L0
B!l0q!JL@o'c0Linux 系统软件更新很快,新的核心几乎每几个星期就公布一次,其它软件的更新也是非常频繁。多数情况下,盲目跟随潮流的升级并不必要,如果确实需要新版本的特性时再升级。换句话说,不要为了升级而升级。Linux系统中多数软件都是用共享库来编译的,其中包含了在不同程序之间共享的公用子例程。
!E4u9e^&zDl0 零点网络/p'Nzx({8vU/P j
在运行某个程序时,如果看到如下信息:“Incompatible library version.”则表明需要将该库升级到程序所需要的版本。库是向下兼容的,也就是说,用老版本库编译的程序可以在新安装的版本库上运行,反之则不行。
F5f$M,vl7RB$Cg;[0
1DdGQ7AX"Z0Linux库函数的升级是一项重要的工作,往往与其它软件包的升级有一定关联作用,所以操作前一定要备份文件。下面看一下如何把Glibc 2.2.4.13升级至2.3.2版本,其过程如下: 零点网络3]I)`*sqA9B

:X|P!LX$z01.下载.gz压缩文件并解压
%[(]k&f7I ])k~W0
Sz})N8Ua)m0在GUN C网站 下载的四个.gz压缩文件,解压至一临时目录中:
Xvlz2ymY gl0 零点网络%Q4^'aL'ms@4T l1^

tO i#Oo0cd /usr/caolinux
pwZd:/7z0tar xzvfglibc-2.3.2.tar.gz
$/)^M3z!C0cd glibc-2.3.2
R [/-n*?E'l1}b8aRa0tar xzvf ../glibc-linuxthreads-2.3.2.tar.gz 零点网络} Sv/Is
tar xzvf ../glibc-crypt-2.3.2.tar.gz 零点网络k4/sH/ L| L
tar xzvf ../glibc-localedata-2.3.2.tar.gz
$G$jU.Rh"N5O.O0 零点网络d;ZQ/r2Z_z P
2.建立库函数的安装目录 零点网络9Ut om3s$c*ek c Ie
零点网络X^)t/F.d[ NIm
mkdir /usr/higlibc
t8}"zht#Dci0cd /usr/higlibc
!Lg/sz)J/x.Q0 零点网络QJ"w6`+_A%CK5P0_|/y
3.建立编译目录 零点网络E_ gK)q;q
零点网络 n'M;|5H6dW
mkdir cao
e.DDF3^:D8O,Sdf0cd cao 零点网络^G9U F)b3NA
./configure --enable-add-ons=linuxthreads,crypt,localedata -prefix
^Bf#gW9Z z/Uy+iA0=/usr/higlibc
9zU R.z:T0 零点网络'/rt%/9L7?)IL3`
4.编译与安装
1kGo Q[Yb{qw2V0 零点网络DvRp4H(`:e
make 零点网络'_YE3z] [*lY
make check 零点网络#S S-y3QQ~.j
make install 零点网络/g3?hfpI I?

BYTj` R$wj1a~.p(G0编译与安装过程根据计算机硬件配置不同,从10分钟到几十分钟不等。 ,
make check 在遇见致命错误时会中断的
bl4D]8L Fq y#[0如果是非致命的错误(也可以理解为无关紧要)就不会停下来
~Xi~ a-]9J4@'b0换句话说,只要make check过程没有自己中断就没问题
 
make check只是在你安装之前对你的环境以及源码等进行检测以确保编译安装正确的,
你可以跳过这一步
 
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。
}L)l7X5Nf.a0 ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,
并不是需要CC或GCC,它是个shell脚本 零点网络.q.^Q$mQ(F&f5|
make是用来编译的,它从Makefile中读取指令,然后编译。 零点网络-?U$iY,~5M
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西。

8k1d4kM KQO0

如果你也写程序想使用AUTOMAKE和AUTOCONF,可以参考CNGNU.ORG上的相关文章。

5[&o-~*Hq Y#G0

呵呵。我补充问一句:make 和 make install 中的mark是系统自带的命令还是可执行程序文件?
。  make install中,是不是可以认为 install是mark的参数???
install 不是make的参数,而是再makefile(Makefile)中型如:install:的语句。
如果用make install,那么就执行install:后面的语句。 零点网络5fJJ0K;r|
 
5.改变数据库的链接零点网络bgaV)v*S5~{
零点网络A+a k8bjY6ah^j
ln -s    /usr/higlibc/lib/ld-linux.so.2       /lib/ld-linux.so.2
6[(Xv nYzKj I0 零点网络t-V`3rg{1a#e:T
零点网络%hTHHF#c
然后,修改/etc/ld.so.conf,加入一行/usr/higlibc/lib,执行下面代码:
3PzdR:O'P q0
4~I e/C6F/{O0ldconfig -v
2hx6fV)_*k0
.r:TP"H3S)[ o0更新/etc/ld.so.cache的内容,列出每个库的版本号,扫描目录和所要创建及更新的链接。 零点网络&mn:u [NNyZ|

s0`gqP:Ep06.更改GCC设置 零点网络NP RAS` my H2qhL

mR.vb&p#~axr0cd /usr/lib/gcc-lib 零点网络-z:/`+PF@ [.s @[
cp -r i386-redhat-linux higlibc
VcN Qu?0 零点网络O)[I#rMxH(Ax W
零点网络 jVQno`
7.更新符号链接
vUR$F7C*CE0 零点网络5G ~bh4d1E
cd /usr/higlibc/include
;P{T2q5hH/0ln -s /usr/src/linux/include/linux 零点网络yEXk'R {k_
ln -s /usr/src/linux/include/asm
3NUX!J/t7R{z,h7[0ln -s /usr/X11R6/include/X11
dE!x2cNN3gY&Y0
bvR5OQ)DmD mO08.测试
k-Qn4kGp+F0 零点网络q#?V-`#sM&@!P-K
编写一个简单的C程序测试一下,除了头文件只需一条printf语句即可: 零点网络;A8vP]m3K!HIW

F`)zAwGKf2A0 零点网络g#?;@PF[2X
#include 零点网络jE;HvLY)Vs"b
int main(void)
yF*J-u/8M0{ printf ("Hello , Linux !/n"); 零点网络 JBfW}M,}0{E
return 0;} 零点网络6gJ6s#X'oD

z]2JHco0
d6g d,xfx$q/*z0然后用GCC编译一次,当程序出现如下运行结果,则说明已经正确地升级了。 零点网络"WKi9P|1O7^
零点网络rhj2h&n0t/

/j9p%yf0k8S0“Hello, Linux !”
(g&aA0w8T!hV)ol0
X${;v"iz0以上五部分分别介绍了Linux库的定义属性、“标准”库的命名和编号约定、经常使用的库、与库操作相关命令的作用,以及库升级的步骤,希望能对初学Linux的开发者有所帮助。
================================================================================

零点网络2sM]M0f])`

Linux动态连接零点网络Pv#PRp p
零点网络6v fXF2x4RjJ
Linux中的应用程序以以下两种方式之一链接到外部函数零点网络 o:`~$}4FQ
  -> 在构建时与静态库(lib*.a)静态链接,并且将库代码包含在该应用程序的可执行文件里
.I&lho i0
  -> 在运行时与共享库(lib*.so)动态链接,通过动态链接装入器,将动态库映射进应用程序
b cb5J*RII0     的可执行内存中
。在启动应用程序之前,动态链接器将所需的共享库映射到应用的内存,零点网络H'G&Y L^(l%d;r
     或者使用系统共享的目标并为应用程序解析所需的外部引用。
t"D+TQG O5[_#R0
a2[ w+p{6yF|{0Linux动态连接
h,O6d ?5k0
n"^5jOIm _3K01.Linux中的应用程序以以下两种方式之一链接到外部函数
B W'QZ~0  -> 在构建时与静态库(lib*.a)静态链接,并且将库代码包含在该应用程序的可执行文件里零点网络 ZP Z;E,a'RR y
  -> 在运行时与共享库(lib*.so)动态链接,通过动态链接装入器,将动态库映射进应用程序零点网络 ?^E2b5c3wY,k*G c
     的可执行内存中。在启动应用程序之前,动态链接器将所需的共享库映射到应用的内存,零点网络R1xM7?6e+~I
     或者使用系统共享的目标并为应用程序解析所需的外部引用。零点网络,x@/bw8PR l Y9O
零点网络/eg6/.{7ObD
2.Linux提供4个函数(dlopen,dlerror,dlsym和dlclose)
3h&w%^gr)a a0  -> 一个include文件[dlfcn.h]以及两个库[静态库-libdl.a和动态库-libdl.so]来支持
Q3F*Wb DqG+UL0     动态链接装入器零点网络&u2aO2l,~ a;G*y_/lF
  -> dlopen:将共享目标文件打开并映射到内存中,并且返回句柄
Jv)S| d8J0  -> dlsym:返回一个指向被请求入口的指针[函数地址]零点网络;C:?(K#r"law!pTnn|
  -> dlerror:返回NULL或者一个指向描述最近错误的ASCII字符串指针零点网络H0oD.o$E
  -> dlclose:关闭句柄并且取消共享目标文件的映射
1}%lxx V-X w0零点网络2].fL9^ @ @u|+F:V
3.动态链接装入例程dlopen需要在文件系统中查找共享目标文件以打开文件并创建句柄,有4种 方式用以指定文件的位置零点网络(x0E5GxM{
  -> 直接在dlopen调用中指定绝对文件路径零点网络4@? S9y+v [ t0@
  -> 在LD_LIBRARY_PATH环境变量中指定的目录中零点网络"Pi1RM#F8h$d
  -> 在/etc/ld.cache中指定的库列表中
`*hNDS0  -> 先在/usr/lib之中,然后在/lib之中
零点网络8u-bA&V|(j!Rj!D

/UtD'b/0另一种:零点网络,r:t}`-m#F

%zg:kA2P"M0在Linux下,大部分系统的library库被安装在/usr/lib目录下。只有一些零点网络%Vn%oun9~5x{
基本的共享库被安装在/lib目录下。例如:libc.so,libcurses.so,libm.so零点网络+O/Wh(I_$SLR
,libtermcap.so(各个版本对应的文件会有些不同),在其他部分被mount上
Y A8A-?(s%x/U K0之前,那些文件是启动Linux系统所必须的。连接器默认的搜索路径是
0ON k[T0m/"r$k5c0/lib,   /usr/lib,       /usr/local/lib

2C9|gjkd0

v"lqQ m0环境变量LD_LIBRARY_PATH列出了查找共享库时除了默认路径之外的其他路径。
{#h)`1wr.H_8i0/etc/ld.so.conf文件则指出了程序ldconfig要搜索的目录。该程序将这些目录中所有的
p,[H6~v!p|J+a:Z0共享库都存储到/etc/ld.so.cache中。假如共享库已经被从默认的目录中零点网络a;oh}(ps#Z k
移走,Linux ELF动态连接库将在/etc/ld.so.cache文件中找该共享库。零点网络P^h'r%~
零点网络T(c*g)H+zd
程序ldconfig将把/etc/ld.so.conf文件中列出的搜索目录中的所有的
`U#M%Q}.Za f/0共享库存储到/etc/ld.so.cache中。假如共享库已经被从默认的目录中
$Cu` Tr[/C0移走,Linux ELF动态连接库将在/etc/ld.so.cache文件中找该共享库。

{vs*T5h C!S!^0零点网络7N"tC@7Y&? z^g#A

对于普通用户无法修改/etc/ld.so.conf,又想用其他位置的库,就可以用LD_LIBRARY_PATH了零点网络9B Yq6RvNt
零点网络1K;G.I'q'E g/W G

x5_S+@l0O/WX$Q[0请参见网上的一篇文摘:
1PQnp*N1t3C$u0今天在给Awstats安装GeoIP插件的时候,提示找不到一个链接库(libGeoIP.so.1),find发现此文件位于/usr/local/lib目录,而系统搜索的是/usr/lib目录,本来可以简单的做一个软链接(ln -s)来解决问题,不过我google之后发现了一个更好的方法:

f*i;t%o|#O0零点网络n$OC't9Yw2R

打开/etc/ld.so.conf加入一行:/usr/local/lib零点网络js+Ct7j]
执行/sbin/ldconfig /etc/ld.so.conf

-p(jJWf1C0零点网络?`x'Jr&Dr

搞定了。

I D+AOJ0关于ld命令的使用方法零点网络tN0Uv.^8JE
零点网络L'I TxAf1l@
4.API组成
b;@&Vw$te0  -> 头文件:#include <dlfcn.h>零点网络 QpW5gX/Q7M y
  -> API实现库:libdl.so.2 => /lib/libdl.so.2
-a.nt3[JCs.l0     -> void * dlopen(const char *filename, int flag);
!L$}2ZV5Xp0     -> const char *dlerror(void);零点网络0va#k:skn h
     -> void * dlsym(void *handle, char* symbol);零点网络R;O}S@m
     -> int dlclose(void *handle);
!}D^}F4b:b j.m,~lD0
@-C1Y&i!o;D05.构建使用共享库的应用程序
9q-a~5n;r c.}5@t0  -> [1]将库的实现源码文件编译成位置无关代码[-fpic]零点网络/"o;L'Z#Mqyc
  -> [2]创建共享库目标文件[lib*.so -shared]零点网络%A4F$@&a8~1`
  -> [3]将主程序同共享库链接[-ldl]p
$w k5a R1N:E"M2P i,V0 零点网络hpG&Q9YCeUgT0Yx
     库的实现源码文件: uppercase.c lowercase.c零点网络 ~#x$n2h&W
     主程序:dltest.c
4w@5n%F`? P{0     [1]
3Y6qac*y9{0       $gcc -c -fpic  uppercase.c零点网络 o#m$@:E0F&rr5t]7a^
       $gcc -c -fpic  lowercase.c
L'YhF'L%e'A0uD0     [2]
1Yd/c!Zb`4@R0       $gcc -shared -lc -o uppercase.so uppercase.o零点网络D&gw@}W~
       $gcc -shared -lc -o lowercase.so lowercase.o零点网络7Q9{@`(O6q;x6O2^h2_
     [3]
"p4X Sl1RUq0       $gcc -o dltest.c -ldl

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值