全部博文(842)
分类: LINUX
2012-03-04 13:52:40
1. 本文所介绍的程序平台
开发板:arm9-mini2440
虚拟机为:Red Hat Enterprise Linux 5
开发板上系统内核版本:linux-2.6.32.2
2. 创建静态链接库
2.1 创建库文件
静态链接库包括一些编译后的文件,他们在链接时连接到程序中,而与运行无关,所以在运行的时候不需要相应的库文件。
gcc -c object1.c 提供编译文件
在unix中系统提供ar命令可用于创建静态链接库,例如:
ar rc libmyutil.a object1.o object2.o object3.o
此命令创建一个名为libmyutil.a的库文件,其中包括object1.o object2.o object3.o三个已编译的文件,如果库文件已创建则将3个文件加入到库文件里面,如果有重复的就替换。
2.2 建立库文件索引
创建库文件后,需要创建库文件索引才能被编译器所用。
ranlib libmyutil.a
注意:由于经过测试ranlib 建立索引之后并不能引用,不知道为什么,连索引文件都没,但是可以将libmyutil.a文件拷贝到用户静态库文件夹,用法还是一样的,我电脑上的用户静态库文件夹为/usr/lib
此命令为库文件libmyutil.a建立索引
2.3 连接库文件
在连接时只需要用-l参数,将库文件连接到可执行文件中,例如:
gcc main.c –lmyutil –o programname
此命令将目标文件(main.o)、库文件(libmyutil.a)连接到可执行文件programname,使用-l参数时,前缀lib与后缀.a都由编译器自动加上。
3.创建动态链接库
动态链接库又称共享库,在连接时,链接器只是检查程序所需要的符号,并不将代码连接到可执行文件中。只有在程序运行的时,由系统将相应的库导入到内存中,并将所需代码与程序代码想连接,这样多个可执行程序可共享相同的库,从而有效地节省内存空间。
3.1创建库文件
为了创建动态链接库,首先要产生与位置无关的代码,例如;
gcc -fPIC -c object1.c
此命令产生与位置无关代码的目标文件object1.o
然后再创建库文件,例如:
gcc -shared libmyutil.so object1.o object2.o object3.o
此命令创建动态链接库库名为libmyutil.so,其中-shared表示创建动态链接库,object1.o object2.o object3.o是库文件中包含的目标文件。
3.2 使用动态链接库
包括两个步骤:
(1) 编译时,链接器检查所需要的动态链接库,确保其包括生成的可执行文件所需的所有符号,这时不将代码插入到执行文件中;
(2) 在程序运行时候需要告诉系统的动态加载程序动态链接库的位置,编译时与静态链接库相同,例如;
gcc main.c –lmyutil –o programname
此命令将目标文件(main.o)、库文件(libmyutil.so)连接到可执行文件programname,使用-l参数时,前缀lib与后缀.a都由编译器自动加上,链接器自动查找动态链接库。
在运行系统动态加载程序将在指定的系统目录下查找相应的动态链接库,例如:/lib,/usr/lib,/usr/X11/lib等,如果创建的动态链接库不在系统目录下,则必须设置LD_LIBRARY_PATH环境变量,可以用ldd命令来检查系统时候能正确地找到程序所加载的动态链接库。
注意:在进行链接的时候注意顺序。
3.2.1 相互引用的库文件
如果库文件A和库文件B相互引用对方的符号,则一个库文件需要引用两次,例如:
gcc main.o –lA –lB –lA
当然这种引用方法效率很低。
3.2.2动态库文件和静态库文件共存
如果系统中同时存在动态库文件和静态库文件,链接器首先检查动态库文件