快速业务通道

Linux系统基础开发技术1:构建Linux 库文件

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-13

Author:gnuhpc
WebSite:blog.csdn.net/gnuhpc

实验环境:Ubuntu Linux 10.04 32bit


1.库文件简介

库文件是一个包含了编译后代码、数据的文件,用于与程序其他代码连编,它可以程序模块化、编译速度更快,并且易于更新.库文件分为三种(实质为两种,在随后两句话有解释):静态库(在程序之前就已经装载进其中了)、共享库(在程序启动之时加载进去,在程序直接共享)、动态加载库(dynamically loaded,DL)(在程序运行中任何时候都可以被加载进程序中使用,事实上DL并非是一个完全不同的库类型,共享库可以用作DL而被动态加载(静态库在Linux貌似无法用dlopen加载).注意有些人使用dynamically linked libraries (DLLs)来指代共享库,有些人使用DLL这个词来形容任何可以被用作DL的库文件,这个请区分对待.

在具体使用中,我们应该多使用共享库,这用户可以独立于使用该库文件的程序而更新库.DL的确非常有用,但有时候我们可能并不需要那些灵活性,而对于静态库,更新起来实在费劲,我们一般不使用.

2.静态库的建立

静态库就是一堆普通的目标文件(object file),习惯上静态库以.a为后缀,这是使用ar命令生成的.静态库允许用户不用重新编译代码就可以链接程序,以节省重新编译的时间,其实这个时间已经在强大的机器配置和快速的编译器中显得微不足道了,这个常常用来提供程序而不是源代码.速度上,静态ELF(Executable and Linking Format)库文件比共享库或者动态加载库快1%-5%,但实际上常常其他因素而并不一定快.

我们写主文件prog.c:

1: #include
2: void ctest1(int *);
3: void ctest2(int *);
4:
5: int main()
6: {
7: int x;
8: ctest1(&x);
9: printf("Valx=%dn",x);
10:
11: return 0;
12: }
13: 然后写这两个函数的实现:

ctest1.c

1: void ctest1(int *i)
2: {
3: *i=5;
4: } ctest2.c

1: void ctest2(int *i)
2: {
3: *i=100;
4: }我们编译这两个函数实现的源文件:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ gcc -Wall -c ctest1.c ctest2.c
gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ls
ctest1.c ctest1.o ctest2.c ctest2.o prog.c

然后创建静态库libctest.a:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ar -cvq libctest.a ctest1.o ctest2.o

a - ctest1.o
a - ctest2.o

我们查看一下这个库中的文件:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ar -t libctest.a
ctest1.o
ctest2.o

此时我们可以编译我们的程序了,注意-l选项,后边的参数是去掉lib和.a的部分,并且需要放在要编译的文件名之后,否则会报错.:

gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ gcc -o test prog.c -L./ –lctest
gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ls
ctest1.c ctest1.o ctest2.c ctest2.o libctest.a prog.c test
gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ./test
Valx=5

3.共享库的建立

共享库是在程序启动时加载的库文件.当共享库加载完毕后所有启动的起来的程序都将使用新的共享库.在创建共享库之前,还需要了解一些知识:

命名规则:
每一个共享库都有一个soname,一般都形如libname.so.versionNumber,其中versionNumber每当接口发生改变时都要增加,一个完全的soname的前缀应该是它所在目录,在一个实际系统中,一个完整的soname只是共享库文件的real name的符号链接.程序运行时在内部列出所需的共享库时使用的就是soname.
每一个共享库也有一个real name,这是包含实际代码的文件名,real name使用soname为前缀,并且在后边添加一些信息,一般都形如soname.MinorNumber.ReleaseNumber. 的releaseNumber可有可无.这个是生成共享

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号