linux使用静态库(linux加载so库方式)
大家好,关于linux使用静态库很多朋友都还不太明白,今天小编就来为大家分享关于linux加载so库方式的知识,希望对各位有所帮助!
linux 静态库和动态库编译的区别
Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln-s libhello.so.1.0 libhello.so.1
ln-s libhello.so.1 libhello.so
动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:
/* hello.c*/
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc-c hello.c-o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc-shared-Wl,-soname,libhello.so.1-o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln-s libhello.so.1.0 libhello.so.1
$ln-s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc-shared参数使其生成是动态库而不是普通执行程序。
-Wl表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B
Linux系统中静态库的使用linux静态库的使用
Linux系统中,静态库主要按照不同的编译工具和架构分为ABI(Application Binary Interfaces)和SYSV ABI两种,又分为ELF(Executable and Linkable Format)、GLIBC(Glib C Library)、GCC(Gnu Compiler Collection)和Binutils(GNU Binary Utilities)。静态库是指存放在共享内存中的一组函数和变量,可以被多个模块共同调用。当安装新的程序时,静态库会被自动拷贝到系统中,使得程序可以正确运行。
静态库的使用通常会在一系列编译过程中被自动调用,有时也可以主动安装静态库。安装静态库的方法通常是使用包含安装指令的脚本文件,运行该脚本文件即可完成静态库的安装。主动安装时,还可以按照特定的架构或者开发工具安装,从而使得程序正确运行。
静态库的主要优点在于能够有效地减少程序的体积,因为静态库中的函数和变量可以由多个程序共同使用,只需要拷贝一次就可以了。此外,静态库使得程序运行更加可靠,因为程序本身不依赖其他软件环境。
然而,静态库也有一些缺点。首先,在安装静态库时,通常需要较多的空间来存放共享库,从而对系统空间造成较大的负担。另外,由于静态库本身比较大,在编译和载入时会比动态库慢,从而降低程序的执行效率。
总的来说,使用静态库可以极大地提高操作系统的可靠性,同时减少程序的体积,但需要考虑安装库需要的空间和编译载入的时间开销,使两种库的使用获得良好的平衡。
Ubuntu静态库怎么使用
-供参考
linux静态库的生成与使用
1、windows系统包括静态链接库(*.lib文件)和动态链接库(*.dll文件)。
2、linux通常把库文件存放在/usr/lib或/lib目录下。
linux库文件名:前缀lib、库名和后缀3部分组成,其中动态链接库以.so作为后缀,静态链接库通常以.a作为后缀。
区别:
静态链接库的代码在编译时就拷贝到应用程序中,这样的优点是节省编译时间动态库是程序在开始运行后调用库函数时才被载入。
静态库的创建和使用
1、在一个头文件中声明静态库所导出的函数。
2、在一个源文件中实现静态库所导出的函数。
3、编译源文件,生成可执行代码(.o文件)
4、将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放文件的目录下。
例如:mylib.h声明函数, mylib.c实现函数
1、编译mylib.c生成目标文件:gcc-o mylib.o-c mylib.c
2、将目标文件加入到静态库中:ar rcs libmylib.a mylib.o
3、将静态库copy到linux的库目录(/usr/lib或者/lib)下:
cp libmylib.a/usr/lib/libmylib.a
4、在调用库函数的文件中添加#include"mylib.h"这样就可调用静态库中函数
5、使用静态库编译:gcc-o main main.c-l mylib
注意:编译时无需带上前缀和后缀。这就是为什么在使用libxml2时librareis(-l)设置为:xml2
-梁兆铃