函数库可以被看做是事先编写的函数集合,里面封装了数据和函数,经过编译后可以直接供给用户程序调用,它可以与主函数分离,从而增加程序开发的复用性。Linux中的函数库可以有两种使用形式:静态库和动态库。系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库类型的不同,后缀名也不一样。静态库和动态库一般分别以后缀.a和.so来区别。
静态库一般是源代码只进行编译后生成的目标文件,不需要进行链接,直接将该目标文件打包成函数库。对这类静态函数库的使用,是在编译链接使用了静态库的源代码文件时,指定好静态库文件(目标文件),将这些静态库文件一起链接到最终的可执行文件中。所以,在最终执行程序时,静态库中被使用到的函数是随程序启动开始就被加载到内存中去的。静态库的创建步骤如下:
●在一个头文件中声明静态库所导出的函数。
●在一个源文件中实现静态库所导出的函数。
●编译源文件,生成可执行代码。
将可执行代码所在的目标文件加入到某个静态库中,并将静态库复制到系统默认的存放库文件的目录下。示例如下:
1)首先创建库文件libhello.c。
2)创建头文件libhello.h。
3)先将其编译成目标文件。
4)创建libhello静态库文件。
其中ar中的rcs的意思是:r表明将模块加入到静态库中,c表示创建静态库,s表示生产索引。
5)写一个测试程序test.c。
6)编译与链接。
静态库的创建结果如图5-6所示。
lhello是给链接器指定库文件名,因为Linux下的库文件名一般都为.a或.so,所以--lhello其实就是指定名称为libhello.a或者libhello.so的库文件名。
动态库是将一组函数编译链接成的一个共享的库文件。使用时,需要在编译链接源代码时指定动态库文件名称。但是与使用静态库文件不同,若使用动态库进行链接,在链接生成最终的可执行文件时不会将用到的库中的函数直接链接到可执行文件中,而只是先链接进来一个函数的符号连接。这样,在执行该可执行程序时,程序不会在一开始启动时就把那些使用到的动态库中的函数加载进来,而是等到具体执行到使用这些函数的代码时才动态加载进来这些库函数。也就是说,到必须用时再加载进来。
图5-6 静态库的创建结果(www.xing528.com)
在Linux下编写动态链接库的步骤如下所示。
1)编写库的头文件和源文件。
2)把所有涉及到的源文件编译为目标文件。
3)把所有的目标文件链接为动态库。
4)建立一个库名链接。
例如:
创建动态库:
-fPIC是指通过这个选项来生成与位置无关的代码,可以在任何地址被链接和装载。
链接动态库:
●soname是库的soname。
●libname是库的名字,包含完整版本号,如libc.so.5.3.12等。
●filelist是想放到库中的目标文件列表。
●liblist是库将要访问的库列表。
-Wl(注意,W为大写)表示将这条g++命令的参数传递给链接器,其实就是直接进行链接,而跳过编译;-shared是一个链接参数,表示将被操作对象链接生成一个共享库(Shared Object)。有了这个参数,连接器就不会因为找不到main函数而报错了。
例如,如果需要从目标文件foo.o和bar.o中创建库文件libfoo.so.1.0.1,同时它的soname是libfoo.so.1,那么就使用以下调用:
还可以通过调用系统函数来使用动态链接库。调用动态库常用的函数见表5-5。
表5-5 调用动态库常用的函数
如果系统中同时存在文件名相同的静态库文件和动态库文件,则系统调用的是动态库文件。因为Linux系统默认采用动态链接方式。这样,若用户要调用含有同名动态库的静态库文件,则在“-l”后就需要写出包含后缀名的文件名。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。