.a与.so区别

简洁概括.o.a .so文件的区别

      .o: 目标文件

      .a:静态库文件,又称目标文件的集合

      .so:动态库文件


生成方法:

1.c2.c 3.c为例

.o文件

       gcc-c 1.c -o 1.o(gcc–c 1.c)

       gcc-c 2.c -o 2.o(gcc–c 2.c)

       gcc-c 3.c -o 3.o(gcc–c 3.c)

.a文件

       ar rcs mylib.a 1.o 2.o 3.o

.so文件

       gcc1.c 2.c 3.c -fPIC -shared -o libmytest.so

调用方法:

1.c

#include“my.h”

voidprintCat()

{

       printf(“MiaoMiao ~ ~ ~ ~\n”);

}

my.h

#include<stdio.h>

voidprintCat(); //1.c

voidprintDog(); //2.c

voidprintPig(); //3.c

=====================================

test.c

#include“my.h”

int main()

{

       printCat();

       return0;

}

.a文件的调用:gcc test.c -o test mylib.a

.so文件的调用:gcc test.c -o test -L. -lmytest

注:若想将.so文件作为共享库,需要将.so文件放到特定的目录下面/usr/local/lib,但即使这样编译还是会报错,需要使用ldconfig命令来更新/ect/ld.so.cache才会生效

<think>我们正在讨论Linux中静态库.a)动态库.so)的区别。根据引用内容,我们可以总结如下: 1. **链接方式**: - 静态库.a)在程序**编译链接**时,库的代码会被完整地复制到生成的可执行文件中。 - 动态库.so)在程序**编译链接**时,不会被复制到可执行文件中,而是在程序**运行时**由系统动态加载到内存中。 2. **文件大小**: - 使用静态库生成的可执行文件体积较大,因为它包含了库的完整代码。 - 使用动态库生成的可执行文件体积较小,因为它只包含对动态库的引用。 3. **运行时依赖**: - 静态库:程序运行时不需要外部库文件,因为库代码已经内嵌在可执行文件中。 - 动态库:程序运行时需要动态库文件存在(在系统库路径或指定路径),否则程序无法启动。 4. **更新维护**: - 静态库:如果库更新,使用该库的程序需要重新编译才能使用新库。 - 动态库:库更新后,只要接口兼容,程序无需重新编译,直接重启程序即可使用新库(引用[2]提到动态库在运行时加载)。 5. **内存占用**: - 静态库:每个使用该库的程序都会在内存中有一份库代码的拷贝,因此如果多个程序使用同一个静态库,内存中会有多份拷贝。 - 动态库:多个程序可以共享同一个动态库在内存中的拷贝,节省内存(引用[2]提到动态库又称为共享库)。 6. **加载速度**: - 静态库:程序启动快,因为库代码已经包含在可执行文件中。 - 动态库:程序启动稍慢,因为需要加载动态库。 7. **同名库的优先级**: - 当静态库动态库同名时(例如,同时存在libhello.alibhello.so),gcc默认会优先链接动态库(引用[3]引用[4]都提到这一点)。 - 如果要强制使用静态库,可以在编译时加上`-static`选项(引用[4])。 8. **命名规范**: - 静态库:命名一般为`libxxx.a`(引用[5])。 - 动态库:命名一般为`libxxx.so`。 9. **生成方式**: - 静态库:通过编译源文件生成目标文件(`.o`),然后使用`ar`工具打包成`.a`文件(引用[1])。 - 动态库:同样先编译生成目标文件(`.o`),然后使用gcc的`-shared`选项生成`.so`文件(引用[1])。 10. **位置**: - 静态库动态库通常存放在系统的库目录中,例如`/lib`、`/usr/lib`、`/usr/local/lib`(引用[5])。 下面用表格总结: | 特性 | 静态库 (.a) | 动态库 (.so) | |--------------|-----------------------------------------------|-------------------------------------------------| | **链接时机** | 编译链接时,库代码被复制到可执行文件 | 编译链接时只记录引用,运行时动态加载 | | **文件大小** | 可执行文件较大 | 可执行文件较小 | | **运行时依赖** | 无需外部库文件 | 需要动态库文件存在 | | **更新库** | 需重新编译程序 | 更新库后重启程序即可(接口兼容时) | | **内存占用** | 每个程序独立占用内存 | 多个程序可共享同一库的内存拷贝 | | **加载速度** | 启动快 | 启动稍慢(需加载动态库) | | **同名优先级** | 默认不优先,需加`-static`强制使用 | 默认优先使用 | | **生成命令** | `ar rcs libxxx.a *.o` | `gcc -shared -o libxxx.so *.o` | | **命名规范** | `libxxx.a` | `libxxx.so` | ### 相关问题 1. 如何生成一个静态库动态库? 2. 在Linux中如何配置动态库的搜索路径? 3. 为什么动态库的版本控制很重要?如何实现? 4. 如何查看程序依赖的动态库? 5. 静态库动态库在程序部署时有什么优缺点? 以上问题可以帮助用户更深入地理解使用这两种库。</think>### Linux静态库(.a)动态库(.so)的区别 | 特性 | 静态库(.a) | 动态库(.so) | |--------------|---------------------------------------------|-----------------------------------------------| | **链接时机** | 编译时被复制到可执行文件[^2] | 运行时由系统动态加载[^2] | | **文件位置** | `/lib`, `/usr/lib`, `/usr/local/lib`[^5] | 同左 | | **命名规范** | `libxxx.a`[^5] | `libxxx.so` | | **内存占用** | 每个程序独立加载库副本 | 多个程序共享内存中的同一副本 | | **文件大小** | 生成的可执行文件较大 | 生成的可执行文件较小 | | **更新维护** | 库更新需重新编译整个程序 | 库更新后只需重启程序(接口兼容时)[^4] | | **加载速度** | 启动快(库代码已包含在可执行文件中) | 启动稍慢(需加载动态库) | | **依赖关系** | 无运行时依赖 | 需确保运行时环境中存在库文件 | | **编译选项** | `ar rcs libxxx.a *.o`[^1] | `gcc -shared -o libxxx.so *.o`[^1] | | **优先级** | 需`-static`强制指定[^4] | 默认优先使用(同名时)[^3][^4] | | **使用场景** | 嵌入式系统、无依赖环境 | 通用程序、节省内存的多进程环境 | ### 核心区别详解 1. **链接机制** - 静态库:在编译链接阶段,库代码被**完整复制**到可执行文件中 $$ \text{可执行文件} = \text{主程序} + \text{静态库代码副本} $$ - 动态库:编译时仅记录引用,运行时由`ld.so`加载器动态映射到内存 $$ \text{可执行文件} = \text{主程序} + \text{动态库引用指针} $$ 2. **内存共享** - 静态库:每个进程独立加载库代码副本(内存浪费) - 动态库:物理内存中仅存一份副本,多个进程共享(节省内存)[^2] 3. **更新影响** - 静态库:修改库需重新编译所有依赖程序 - 动态库:更新后只需重启程序(需保持ABI兼容) ```bash # 动态库更新示例 cp libnew.so /usr/lib/libold.so # 替换库文件 restart_program # 重启程序生效 ``` 4. **加载优先级** 当同名库共存时,gcc默认优先链接动态库[^3][^4]: ```bash gcc main.c -lhello # 默认使用libhello.so gcc main.c -static -lhello # 强制使用libhello.a ``` ### 典型应用场景 - **静态库适用**: - 嵌入式设备(无动态加载环境) - 需完全独立部署的程序 - 对启动速度要求极高的场景 - **动态库适用**: - 桌面/服务器应用程序 - 需要热更新的系统组件 - 被多个进程共享的公共库(如glibc) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值