基于Linux,看清C++的动态库和静态库

动态库和静态库是Linux编程中常用的两种库类型,它们在编译、链接和运行时的行为上存在本质区别,适用于不同的应用场景。本文将详细讲解静态库和动态库的本质区别、应用场景,以及如何通过示例代码、制作和应用动态库及静态库来理解它们的使用。


一、静态库和动态库的本质区别

1. 静态库(Static Library)

静态库是编译时将库的代码直接链接到可执行文件中。程序运行时不再依赖外部的库文件。

  • 优点
    • 程序体积较大,但运行时不需要额外加载库文件,启动速度较快。
    • 适用于对程序体积和启动速度有较高要求的场景,如嵌入式系统。
  • 缺点
    • 占用空间较大,因为每个程序都包含完整的库代码。
    • 更新库时需要重新编译所有依赖该库的程序。

2. 动态库(Dynamic Library)

动态库在程序运行时才加载库代码。动态库的代码不会被嵌入到可执行文件中,而是以独立的共享库文件(如.so文件)的形式存在。

  • 优点
    • 程序体积较小,多个程序可以共享同一个动态库。
    • 动态库可以独立更新,无需重新编译所有依赖程序。
  • 缺点
    • 程序启动时需要加载动态库,可能会增加启动时间。
    • 动态库需要随程序分发,否则程序无法运行。

二、应用场景的区别

1. 静态库适用场景

  • 程序需要独立运行,且不依赖外部环境(如嵌入式系统)。
  • 程序需要快速启动,且对体积要求不高。
  • 库代码不需要频繁更新。

2. 动态库适用场景

  • 多个程序共享同一个库文件。
  • 库代码需要频繁更新(如系统库、第三方库)。
  • 程序需要跨平台或跨版本兼容。

三、示例代码:GuoYao调用YongYong

1. 静态库示例

静态库代码(yongyong.c)

c 复制代码
#include <stdio.h>

void yongyong_function() {
    printf("This is YongYong's function in static library!\n");
}

主程序代码(guoyao.c)

c 复制代码
#include <stdio.h>

void yongyong_function();

int main() {
    printf("GuoYao is calling YongYong's function...\n");
    yongyong_function();
    return 0;
}

编译和链接命令

bash 复制代码
# 生成静态库
ar rcs libyongyong.a yongyong.o

# 编译并链接
gcc guoyao.c -L. -lyongyong -o guoyao_static

运行程序

bash 复制代码
./guoyao_static

输出

复制代码
GuoYao is calling YongYong's function...
This is YongYong's function in static library!

2. 动态库示例

动态库代码(yongyong.c)

c 复制代码
#include <stdio.h>

void yongyong_function() {
    printf("This is YongYong's function in dynamic library!\n");
}

主程序代码(guoyao.c)

c 复制代码
#include <stdio.h>

void yongyong_function();

int main() {
    printf("GuoYao is calling YongYong's function...\n");
    yongyong_function();
    return 0;
}

编译和链接命令

bash 复制代码
# 生成动态库
gcc -shared -fPIC yongyong.c -o libyongyong.so

# 编译并链接
gcc guoyao.c -L. -lyongyong -o guoyao_dynamic

运行程序

bash 复制代码
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  # 设置动态库搜索路径
./guoyao_dynamic

输出

复制代码
GuoYao is calling YongYong's function...
This is YongYong's function in dynamic library!

四、制作动态库及应用动态库

1. 制作动态库

步骤

  1. 编写动态库代码(如yongyong.c)。

  2. 使用gcc生成动态库:

    bash 复制代码
    gcc -shared -fPIC yongyong.c -o libyongyong.so
    • -shared:生成共享库(动态库)。
    • -fPIC:生成位置无关代码(Position Independent Code),适用于动态加载。
  3. 使用动态库:

    bash 复制代码
    gcc guoyao.c -L. -lyongyong -o guoyao_dynamic
    • -L.:指定当前目录为库搜索路径。
    • -lyongyong:链接libyongyong.so

2. 运行动态库程序

  • 确保动态库路径在LD_LIBRARY_PATH中:

    bash 复制代码
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
  • 运行程序:

    bash 复制代码
    ./guoyao_dynamic

五、制作静态库及应用静态库

1. 制作静态库

步骤

  1. 编写静态库代码(如yongyong.c)。

  2. 编译生成目标文件:

    bash 复制代码
    gcc -c yongyong.c -o yongyong.o
  3. 使用ar生成静态库:

    bash 复制代码
    ar rcs libyongyong.a yongyong.o
    • ar是静态库打包工具。
    • -r:替换现有文件。
    • -c:生成索引。

2. 应用静态库

步骤

  1. 编写主程序代码(如guoyao.c)。

  2. 编译并链接:

    bash 复制代码
    gcc guoyao.c -L. -lyongyong -o guoyao_static
    • -L.:指定当前目录为库搜索路径。
    • -lyongyong:链接libyongyong.a
  3. 运行程序:

    bash 复制代码
    ./guoyao_static

六、总结

  • 静态库适用于对启动速度和独立性要求较高的场景,但程序体积较大且更新不便。
  • 动态库适用于需要共享库代码的场景,程序体积较小且支持动态更新。
  • 在实际开发中,选择静态库还是动态库需要根据具体需求进行权衡。

通过本文的示例代码和制作流程,读者可以更直观地理解静态库和动态库的区别及应用场景。希望本文能够帮助开发者更好地掌握Linux编程中库的使用技巧。

相关推荐
devilnumber7 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
kebidaixu7 小时前
BCU 平台 RS485 驱动适配:从 THVD1406 到 ISO3082
linux
unicrom_深圳市由你创科技8 小时前
哪些控制逻辑应该放在 PLC,哪些放在上位机?
c++
asdfg12589639 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy11019 小时前
JavaScript变量
开发语言·javascript·ecmascript
映翰通朱工9 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
玖玥拾10 小时前
C/C++ 基础笔记(十三)继承
c语言·c++·继承
洪晓露10 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
z落落10 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway210 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash