C语言静态链接库和动态链接库讲解及制作使用

C语言静态链接库和动态链接库讲解及制作使用

1. 引言

静态链接库和动态库均为函数库

函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用
就像scanf和printf函数一样,通过#include <stdio.h>,即可调用
早期并没有函数库,只是后来的程序员们通过整理把日常用的函数进行合并,形成一份完整的函数库,就是现在的标准函数库,例如:glibc

静态链接库:

  • 函数库源代码经过只编译不链接形成的.o目标文件,然后通过ar工具将.o文件归档成.a静态链接库文件
  • 商业公司通过发布.h头文件和.a静态链接库文件给用户使用
  • 用户拿到.a和.h文件,通过.h文件得知函数库内的函数原型,然后在自己的.c文件中直接调用这些库函数
  • 在链接形成可执行程序过程中:链接器会在.a文件中找到对应的.o文件
  • 缺点:如果多个应用程序都使用了同一个静态库的库函数时,则会导致每个应用程序在生成可执行程序中,都各自复制了一份库函数的代码,这些应用程序如果同时运行,在系统内存中则会存在多个库函数的副本,很浪费内存

动态链接库(.so Shared Object共享库)

  • 优点:不像静态链接库那样,拷贝库函数的代码到可执行程序中,而是在可执行程序需要调用到库函数的位置做了标记,当可执行程序运行到调用该库函数的位置,会自动将该动态库加载到内存,以后不管多少个应用程序同时运行,该库函数在内存中只有一份

2. 制作静态链接库

  • mylib.c
#include <stdio.h>
int Max(int a, int b)
{
        return (a > b) ? a : b;
}

void PrintMaxNumber(int a, int b)
{
        printf("The max is %d.\n", Max(a, b));
}
  • mylib.h
int Max(int a, int b);

void PrintMaxNumber(int a, int b);

  • 将 mylib.c 编译为 mylib.o 目标文件
gcc -c mylib.c -o mylib.o
  • 使用 ar 工具,将 mylib.o 目标文件打包为 libmylib.a 静态链接库文件
ar -rc libmylib.a mylib.o

3. 使用静态链接库

  • test.c
#include <stdio.h>
#include "mylib.h"

int main()
{
        int a = 5;
        int b = 3;
        int max = Max(a, b);

        printf("The max number is %d.\n", max);

        PrintMaxNumber(a, b);
        return 0;
}

  • 将 test.c 编译链接为可执行程序
gcc test.c -o test -lmylib -L.
  • 运行 test 可执行程序,查看结果
mrs@mrs-virtual-machine:~/Desktop$ ./test 
The max number is 5.
The max is 5.

4. 制作动态链接库

  • 编译链接生成 mylib.o
gcc -c mylib.c -o mylib.o -fPIC
  • 将 mylib.o 打包生成 libmylib.so 动态链接库文件
gcc -o libmylib.so mylib.o -shared
  • 将 /Desktop 目录(因为我的libmylib.so就是在这个目录)加入到 LD_LIBRARY_PATH 动态链接库路径下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/Desktop

5. 使用动态链接库

  • 将 test.c 编译链接为 test 可执行程序
gcc test.c -o test -lmylib -L.
  • 运行 test 可执行程序,得到运行结果
mrs@mrs-virtual-machine:~/Desktop$ ./test 
The max number is 5.
The max is 5.

附录

功能命令
nm libmylib.a查看当前 .a 文件内都有哪些符号(函数名)
-lxxx该命令为GCC编译链接的参数,指定链接时用到哪些函数库,xxx表示函数库的名称
ldd test查看可执行程序 test 使用到哪些共享库,以及这些共享库是否能被加载解析
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言的隐式静态链接库(.a)是一个在编译时将库的对象代码与应用程序一起链接起来的库文件。它作为一个整体被插入到可执行文件,使得应用程序在运行时能够使用的函数和变量。 使用隐式静态链接库的主要步骤如下: 1. 首先,需要将库文件(.a文件)放置在合适的路径下,确保编译器能够找到它。 2. 在编写C语言程序时,需要包含对应的库头文件,以便能够使用的函数和变量。 3. 在使用库函数或变量时,需要在编译命令链接对应的库文件。这可以通过在编译命令使用参数"-l"和"-L"来完成。"-l"用于指定库文件的名称,"-L"用于指定库文件的路径。 4. 编译时,编译器会从指定的库文件提取需要的函数和变量,并将它们与应用程序的代码合并在一起生成可执行文件。 隐式静态链接库的一个优点是,使用它们可以直接将库的功能嵌入到可执行文件,无需额外的库文件依赖。这样可以简化程序的部署和分发。 然而,隐式静态链接库的缺点是,当多个应用程序都使用同一个库时,每个可执行文件都会包含库的副本,导致可执行文件的大小增加。而且,如果库的更新需要重新编译所有依赖它的应用程序。 总之,隐式静态链接库是一种在编译时将库的对象代码与应用程序进行链接的方式,使得应用程序能够直接使用的函数和变量。它的使用需要在编译命令显式指定库文件,并将其与应用程序代码合并生成可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值