linux中动态库和静态库的区别简洁一点
时间: 2025-05-19 09:19:39 浏览: 25
### Linux 中动态库和静态库的区别
#### 1. 定义与特性
静态库是以 `.a` 文件形式存在的预编译目标文件集合,通常用于在链接阶段将这些目标文件嵌入到最终可执行文件中[^2]。而动态库则是以 `.so` 文件形式存在,在程序运行时由动态链接器加载并解析依赖关系[^2]。
#### 2. 链接方式
静态库在编译期间被完全复制到可执行文件内部,因此生成的二进制文件较大,但独立性强,无需额外依赖外部资源即可运行[^2]。相比之下,动态库仅记录其位置信息于可执行文件之中,实际代码并不包含其中,这使得最终产物体积更小却需要相应共享对象存在于系统特定路径下才能正常工作[^2]。
#### 3. 加载时机
当应用程序使用静态库构建时,所有必要的函数实现都会在构建过程中固定下来,并成为应用的一部分[^2]。对于采用动态库的应用来说,则是在启动或者调用某个功能模块之前才完成所需组件的实际装载操作——即所谓的延迟绑定机制发挥作用之时。
#### 4. 更新维护便利性
由于每次修改都需要重新创建整个项目来反映更改点,所以基于静态连接开发的产品后期调整起来相对麻烦一些[^2];然而通过更新单独版本号较高的SO文件就可以让多个利用相同基础逻辑的不同进程受益于此改进成果而不必逐一重做它们各自的部署包—这就是为什么现代软件倾向于更多地依靠DLs而不是SLs的原因之一.
以下是简单的CMake脚本展示如何分别定义这两种类型的库:
```cmake
cmake_minimum_required (VERSION 3.5)
project (demo)
set (SRC_LIST ${PROJECT_SOURCE_DIR}/testFunc/testFunc.c)
add_library (testFunc_shared SHARED ${SRC_LIST})
add_library (testFunc_static STATIC ${SRC_LIST})
set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
```
此段代码片段展示了如何在一个名为 `demo` 的工程里同时建立一个叫作 `testFunc` 的共享以及静态版库,并设置输出目录为项目的根级 `/lib` 下面[^3]。
#### 动态库搜索路径优先级
值得注意的是,无论选择哪种类型的库进行项目搭建,如果涉及到.so文件的话还需要注意它的查找次序问题。一般而言会按照下面这个列表里的顺序依次尝试定位所需的DLL:
- 编译目标代码时明确指出的位置;
- 用户自定义环境变量 `LD_LIBRARY_PATH` 所指向的地方;
- 系统全局配置文档 /etc/ld.so.conf 列举出来的区域再加上之后经由命令 ldconfig 处理后的缓存数据;
- 常规保留的标准地址比如 /lib 和 /usr/lib 。[^1]
---
阅读全文
相关推荐



















