Linux 静态库 和 动态库

在Linux系统上,库文件用于共享和重用代码。根据使用方式和链接方式的不同,库文件可以分为静态库和动态库。

静态库(Static Library)

静态库是在编译时被嵌入到最终可执行文件中的库。静态库的扩展名通常是.a。

特点

  1. 独立性:静态库在编译时就被包含在可执行文件中,因此可执行文件独立于库的存在。
  2. 大小增加:由于静态库的代码被直接复制到可执行文件中,最终的可执行文件大小会增加。
  3. 加载速度快:因为库代码已经在可执行文件中,不需要在运行时加载,启动速度较快。
  4. 更新困难:更新静态库中的代码需要重新编译可执行文件。

创建静态库

1.编写源代码:

假设你有两个源文件’foo.c’ 和 ‘bar.c’
foo.c:

// foo.c
#include <stdio.h>

void foo() {
    printf("This is function foo.\n");
}

bar.c:

// bar.c
#include <stdio.h>

void bar() {
    printf("This is function bar.\n");
}

2.编译源文件:

使用 gcc 将源文件编译为目标文件(.o 文件)。

gcc -c foo.c bar.c
这将生成 foo.o 和 bar.o 两个目标文件。

3.创建静态库:

使用 ar 命令将目标文件打包成静态库。

ar rcs libmylib.a foo.o bar.o
这将创建一个名为 libmylib.a 的静态库文件。

使用静态库

1.编写主程序:

创建一个使用静态库的主程序 main.c。

main.c:

// main.c
void foo();
void bar();

int main() {
    foo();
    bar();
    return 0;
}

2.编译并链接静态库:

在编译主程序时链接静态库。

gcc -o myprogram main.c -L. -lmylib
其中,-L. 指定库的路径,-lmylib 指定链接的库名(libmylib.a)。

3.运行程序:

执行生成的可执行文件。
./myprogram
输出将会是:
This is function foo.
This is function bar.

动态库(Dynamic Library)

动态库是在运行时被加载的库。动态库的扩展名通常是.so(共享对象)。

特点

  1. 共享性:多个程序可以共享同一个动态库,节省内存和磁盘空间。
  2. 可更新性:更新动态库时,不需要重新编译使用该库的可执行文件,只需替换动态库即可。
  3. 加载速度慢:在运行时加载动态库,启动速度可能比静态库稍慢。
  4. 依赖性:可执行文件依赖动态库的存在和版本匹配,缺失或版本不匹配会导致程序无法运行。

创建动态库

1.编写源代码:

假设你有两个源文件’foo.c’ 和 ‘bar.c’
foo.c:

// foo.c
#include <stdio.h>

void foo() {
    printf("This is function foo.\n");
}

bar.c:

// bar.c
#include <stdio.h>

void bar() {
    printf("This is function bar.\n");
}

2.编译源文件:

使用 gcc 将源文件编译为位置无关代码(Position Independent Code, PIC)的目标文件(.o 文件)。

gcc -fPIC -c foo.c bar.c
这将生成 foo.o 和 bar.o 两个目标文件。

3.创建动态库:

使用 gcc 将目标文件链接成动态库。

gcc -shared -o libmylib.so foo.o bar.o
这将创建一个名为 libmylib.so 的动态库文件。

使用动态库

1.编写主程序:

创建一个使用动态库的主程序 main.c。

main.c:

// main.c
void foo();
void bar();

int main() {
    foo();
    bar();
    return 0;
}

2.编译并链接动态库:

在编译主程序时链接动态库。

gcc -o myprogram main.c -L. -lmylib
其中,-L. 指定库的路径,-lmylib 指定链接的库名(libmylib.so)。

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

在运行时,动态库需要在系统的库搜索路径中,可以通过设置 LD_LIBRARY_PATH 环境变量指定路径。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./myprogram

输出将会是:
This is function foo.
This is function bar.

解释 export LD_LIBRARY_PATH=.: $ LD_LIBRARY_PATH:

export:这是一个 shell 命令,用于设置环境变量,使其对后续的命令和脚本可见。
LD_LIBRARY_PATH=.:将当前目录(. 表示当前目录)添加到 LD_LIBRARY_PATH 中。这样,系统会在当前目录中查找动态库。
:$LD_LIBRARY_PATH:将已有的 LD_LIBRARY_PATH 环境变量的值追加到新的 LD_LIBRARY_PATH 中。这保证了之前设置的搜索路径不会丢失。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值