目录
Linux库的概念
Linux 静态库
Linux 静态库作用
Linux 静态库的创建
1. 将.c文件生成.o文件
编辑
2. 将所有的.o文件归档为一个静态库.a文件
Linux 静态库的使用
Linux 动态库:
Linux 动态库作用
Linux 动态库的创建
生成.so动态库文件
编辑
Linux 动态库的使用
!!执行出错!!编辑
解决办法
1、将生成的动态库拷贝到 /usr/lib 中
2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
总结
Linux库的概念
Linux静态库和动态库都是可重用的二进制代码块,它们可以使程序的编写更加高效和简洁。
静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中),而动态库会在运行时加载,因此多个程序可以共享同一个库,从而节省内存(在程序执行时动态地由目标程序去调用)。
Linux 静态库
Linux静态库是一种可重用的二进制代码块,它是链接到包含它的程序的一部分,因此当该程序运行时,不需要外部依赖。静态库的文件扩展名为“.a”,通常由一系列编译后的.obj或.o文件组成。
Linux 静态库作用
1. 简化代码的维护和升级:通过将常用的功能放在一个独立的库中,可以方便地维护和升级整个程序集。
2. 提高代码的安全性:静态库被完全集成到应用程序中,使得程序在没有网络连接的情况下也能正常运行,从而提高了代码的安全性。
3. 减少内存占用:由于静态库在编译时就被链接到程序中,所以不必担心重复加载,从而减少了内存占用。
4. 不受版本控制影响:因为静态库已经被完全包含在程序内部,所以不受其他程序的版本控制影响。
Linux 静态库的创建
在Linux环境中,可以通过以下步骤创建静态库:
1. 将.c文件生成.o文件
使用gcc编译器或其他合适的编译器,将所有要包含在库中的源代码文件编译成.o文件。
生成.o文件
gcc -c 文件名.c
继续使用上一小节工厂模式的代码将cat.c dog.c person.c 生成对应的.o文件
2. 将所有的.o文件归档为一个静态库.a文件
运行ar命令,将所有的.o文件归档为一个静态库文件(ar 指令是一个Unix/Linux系统中的档案管理工具,主要用于管理和处理备存文件(archive))
将.o文件生成.a静态库文件
ar rcs lib+要生成静态库的名字.a *.o
//lib是library(库)的缩写
//*.o中“ * ”是通配符,表示该文件夹中的所有.o文件
//ar 命令中的 rcs 是 -rcs 参数组合的一个简写形式,分别代表以下几个动作:
-r:追加档案到归档文件。
-c:创建归档文件。如果指定的目标文件已经存在,则清空后再进行操作。
-s:排序归档文件内的成员。
综合起来,-rcs 参数就是追加、清除及排序的意思。这意味着,如果你有一个已经存在的归档文件,你想向里面添加一些新的档案,那么应该使用 -rcs 参数,这样可以确保归档文件中的成员按照正确顺序排列。
成功生成了名为libfactory.a的静态库文件
Linux 静态库的使用
在创建完静态库后,就可以在其他程序中使用它了。
这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的静态库
在编译时,只需将库添加到链接器命令中
gcc 文件名.c -L./ -l静态库名(砍头去尾) -o 可执行文件名字
//砍头去尾是意思是:我们生成静态库名字是 libfactory.a,
使用-l链接的时候只需-lfactory即可,去掉lib和.a
不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的
运行效果
Linux 动态库:
Linux动态库是一种共享的、可执行的二进制代码块,它在程序运行时被装载到内存中,因此它可以被多个进程同时使用,节省了内存资源。动态库的文件扩展名为“.so”,即Shared Object(共享对象)的缩写。
Linux 动态库作用
1. 节省空间:由于多个程序可以共享一个动态库,因此可以节省磁盘空间和内存。
2. 改进性能:动态库只在程序真正需要时才被载入内存,这样可以提高系统的整体性能。
3. 更新灵活:动态库可以单独更新而不必重新编译整个程序。
4. 提供更强的灵活性:动态库可以随时安装和卸载,无需重新编译程序。
Linux 动态库的创建
在Linux环境中,可以通过以下步骤创建动态库:
生成.so动态库文件
生成.so动态库文件
gcc -shared -fpic 文件名.c -o lib名字.so
//-shared 选项告诉 GCC 在生成目标文件时产生共享库(也就是动态链接库)。这表示你的程序可以动态链接到其他程序中,因此无需在运行时每次都加载整个库文件,而是只加载必要的部分。
//-fpic 是 Position Independent Code 的缩写,意为位置无关代码,它会让 GCC 在编译目标文件时创建一个独立于内存位置的代码,这样就可以在程序运行时改变动态库的内存位置。
Linux 动态库的使用
在创建完动态库后,就可以在其他程序中使用它了。
这时我们可以删除(rm)/移动(mv)功能函数以及第一步生成的.o文件,只留下头文件、主函数和生成的动态库
在编译时,只需将库添加到链接器命令
gcc 文件名.c -L./ -l动态库名(砍头去尾) -o 可执行文件名字
//砍头去尾是意思是:我们生成静态库名字是 libfactory.so,
使用-l链接的时候只需-lfactory即可,去掉lib和.so
不加-L ./会报错,因为-l链接的库默认在/usr/lib /usr/local/lib下面寻找,加上-L ./后告诉编译器在当前目录下寻找这个库,因为这个静态库是我们自己生成的
!!执行出错!!
静态库编译后可以直接运行可执行文件但是动态库不可以:静态库会被编译并包含在程序中,因此当程序运行时,不需要外部依赖(在程序编译前就加入到目标程序中),而动态库会在运行时加载,(在程序执行时动态地由目标程序去调用,程序执行的时候才去寻找动态库)。
解决办法
1、将生成的动态库拷贝到 /usr/lib 中
删除 /usr/lib 下的动态库方便验证法2
2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
export LD_LIBRARY_PATH="生成的动态库所在的文件夹路径"
树莓派中但这个命令是临时的只限于运行这个命令的窗口,换一个窗口就不行了(虚拟机不会)
写一个shell脚本解决这个问题
总结
静态库的优点在于它们不需要在运行时存在,而动态库需要在运行时可用,否则程序将无法启动。但另一方面,静态库会增加最终程序的大小,因为它们的代码被嵌入到了程序中,而动态库则是只在运行时加载,从而减小了程序的大小。此外,静态库比动态库更容易安全审计,因为它们是完全内置到程序中的。 总的来说,静态库适合于那些只需要少量更改并且不需要频繁更新的代码模块,而对于需要经常更新和更改的模块更适合使用动态库。
动态链接库(Dynamic Link Library,也称作 Shared Library 或 Shared Object)在运行时才被加载到内存中,它的好处是可以被多个程序共享,只需要一份物理内存,节省了磁盘空间和内存资源,并且更容易被更新。
动态链接库还有以下优点:
1. 当你需要更新模块的功能时,可以只更新动态链接库,不用重新编译程序。
2. 可以链接多个程序。
3. 可以链接不同语言编写的程序。
4. 可以降低模块之间的耦合度。
相反,静态链接库在编译时就会被链接进程序中,因此一旦发布就不能再更改,如果不重新编译程序就无法更新库的功能。
总的来说,如果模块需要经常更新或具有跨平台的需求,动态链接库是一个更好的选择。