基于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编程中库的使用技巧。

相关推荐
不想看见40411 小时前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt
王老师青少年编程11 小时前
信奥赛C++提高组csp-s之组合数学专题课:鸽巢原理详解及案例实践
c++·组合数学·信奥赛·抽屉原理·csp-s·提高组·鸽巢原理
sjmaysee11 小时前
Java框架SpringBoot(一)
java·开发语言·spring boot
寒秋花开曾相惜12 小时前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
想唱rap12 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
JFSJFX12 小时前
手机短信误删怎么办?这4种恢复办法亲测有效,轻松找回短信
运维·服务器
Tony Bai12 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
njidf12 小时前
C++与Qt图形开发
开发语言·c++·算法
qwehjk200812 小时前
代码动态生成技术
开发语言·c++·算法
cccccc语言我来了12 小时前
Linux(9)操作系统
android·java·linux