C语言:静态库和动态(共享)库

相关阅读

C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482


在软件开发中,库(Library)是一个至关重要的概念。它们是由函数和数据的集合构成,用于实现特定的功能,供其他程序调用和使用。根据它们的链接方式和使用时机,库可以分为两类:静态库(Static Library)和动态(共享)库(Dynamic or Shared Library)。本文将深入探讨这两种库的特点、创建和使用方法,以及它们各自的优缺点。

静态库

静态库在编译时被包含到可执行文件中。它们通常有以下特点:

1、文件拓展名:在windows操作系统上是.lib,在Unix-like操作系统(如Linux)上是.a。

2、链接时机:静态库在编译链接阶段被包含到可执行文件中。

3、独立性:生成的可执行文件独立于库文件运行,不依赖外部库。

创建静态库

以C语言为例,创建一个简单的数学库:

1、编写源代码:

cpp 复制代码
// mathlib.c
#include "mathlib.h"

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

对应的头文件:

cpp 复制代码
// mathlib.h
#ifndef MATHLIB_H
#define MATHLIB_H

int add(int a, int b);
int multiply(int a, int b);

#endif // MATHLIB_H

2、编译源文件为目标文件:

bash 复制代码
gcc -c mathlib.c -o mathlib.o

3、创建静态库:

bash 复制代码
ar rcs libmathlib.a mathlib.o

使用静态库

1、编写使用静态库的程序:

cpp 复制代码
// main.c
#include <stdio.h>
#include "mathlib.h"

int main() {
    int sum = add(3, 4);
    int product = multiply(3, 4);
    printf("Sum: %d\n", sum);
    printf("Product: %d\n", product);
    return 0;
}

2、编译并链接静态库:

bash 复制代码
gcc main.c -L. -lmathlib -o main

3、运行程序:

bash 复制代码
./main
Sum: 7
Product: 12

动态(共享)库

动态库在程序运行时被加载。它们通常有以下特点:

1、文件拓展名:在windows操作系统上是.dll,在Unix-like操作系统(如Linux)上是.so(Shared Object)。

2、链接时机:动态库在程序运行时被加载,使用动态链接。

3、共享性:多个程序可以共享同一个动态库文件,从而节省内存。

创建动态库

仍以C语言为例,创建一个动态数学库:

1、编写源代码(与静态库相同):

cpp 复制代码
// mathlib.c
#include "mathlib.h"

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

对应的头文件:

cpp 复制代码
// mathlib.h
#ifndef MATHLIB_H
#define MATHLIB_H

int add(int a, int b);
int multiply(int a, int b);

#endif // MATHLIB_H

2、编译源文件为目标文件,并生成动态库:

bash 复制代码
gcc -fPIC -c mathlib.c -o mathlib.o
gcc -shared -o libmathlib.so mathlib.o

使用动态库

1、编写使用动态库的程序(与静态库相同):

cpp 复制代码
// main.c
#include <stdio.h>
#include "mathlib.h"

int main() {
    int sum = add(3, 4);
    int product = multiply(3, 4);
    printf("Sum: %d\n", sum);
    printf("Product: %d\n", product);
    return 0;
}

2、编译并链接动态库:

bash 复制代码
gcc main.c -L. -lmathlib -o main

3、设置库路径并运行程序:

bash 复制代码
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main
Sum: 7
Product: 12

静态库与动态库的比较

特点 静态库 动态库
链接时机 编译时包含到可执行文件中 运行时加载
文件扩展名 .lib(Windows) .a(Linux) .dll(Windows) .so(Linux)
独立性 可执行文件独立,不依赖外部库 可执行文件依赖于外部库
内存使用 每个程序各自包含一份库代码,占用更多内存 多个程序共享同一个库文件,占用更少内存
更新和维护 更新库需要重新编译和链接所有程序 更新库时,只需替换库文件
相关推荐
zhangfeng11335 小时前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
chao18984411 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
赏金术士11 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
楼兰公子12 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
知识领航员13 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
吴声子夜歌13 小时前
Go——并发编程
开发语言·后端·golang
ooseabiscuit13 小时前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
c1s2d3n4cs14 小时前
Qt模仿nlohmann::json进行序列化和反序列化
开发语言·qt·json
AiTop10014 小时前
Claude Code 推出 Agent View:命令行编程正式进入“多线程并发“时代
开发语言·人工智能·ai·aigc
jf加菲猫14 小时前
第21章 Qt WebEngine
开发语言·c++·qt·ui