静态库与动态库的制作(C语言)

发布于:2023-01-04 ⋅ 阅读:(269) ⋅ 点赞:(0)

摘要:今天给大家分享一下动态库和静态库的制作,相信大家已经忘记的差不多了吧,一起来复习复习吧!

        库的本质:二进制文件

        库的类型静态库和动态库(共享库)

        静态库和动态库的区别在于加载程序的时机不同

静态库:在程序的编译阶段(链接阶段),将库中函数的代码以复制拷贝的方式加载到源程序中。

        特点:① 占用资源空间,文件体积大

                   ② 运行时不需要静态库的存在

                   ③ 可移植性强

                   ④ 优化升级时,需要重新编译源文件

动态库:在程序的运行阶段,只是将需要用到的函数做一个记录,最后在程序运行的阶段再加载需要用到的函数。

        特点:① 不占用资源空间,文件体积小

                   ② 运行时需要动态库的存在

                   ③ 可移植性不强

                   ④ 优化升级时,不需要重新编译源文件

一,静态库的制作

        静态库的制作需要四个步骤,分别是:

1)先预留接口函数

2)实现所有函数功能

3)生成所有的.c文件的目标文件(以.o结尾的文件)

4)编译生成静态库

1)先预留接口函数

eg:创建一个1.h文件:

#ifndef __HELLO__
#define __HELLO__
void hello(void);
void world(void);

#endif

2)实现所有函数功能

eg:创建hello.c

#include <stdio.h>
#include "1.h"
void hello(void)

{
    printf("hello\n");
}

 eg:创建world.c

#include <stdio.h>

#include "1.h"

void world(void)
{
    printf("world\n");
}

 eg:创建main.c

#include <stdio.h>
#include"1.h"
int main(int argc, char *argv[])
{ 
    hello();
    world();

    return 0;
}

3)生成所有的.c文件的目标文件(以.o结尾的文件)

        gcc -c hello.c

        gcc -c word.c

        gcc -c main.c

 4)编译生成静态库

        ar crs 库文件名 目标文件

​            

         静态库文件的命名规范: 以lib开头,以.a结尾,中间为库名

        lib1.a -->   lib1.a == 库文件名

       1 == 库名

        链接静态库:

        gcc main.c  -L. -l1(注 "L"后面有个 "." ,库在当前路径)

        gcc main.c -l1 (库不在当前)

没链接库之前运行: 

 

链接库之后:

二,动态库的制作

步骤几乎与静态库一样,但第三步指令不一样而且生成动态库时,后缀为.so  

1)先预留接口函数

2)实现所有函数功能

3)将所有的.c文件生成对应的目标文件

        gcc -c -fPIC hello.c -o hello.o     

        -fPIC -- 表示生成位置无关代码

4)编译生成动态库

        gcc -shared -o libhello.so hello.o

        动态库文件的命名规范:

        以lib开头,以.so结尾,中间为库名

        libhello.so -->   libhello.so == 库文件名

        hello == 库名

 5)让库能正常被链接

​    (1) 把库拷贝到/usr/lib和/lib目录下。 

​    (2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。(只对当前shell有效) 

​    (3) 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。
         这样,加入的目录下的所有库文件都可见。

    (4)     链接动态库:gcc main.c  -L. -lhello

gcc -c -fPIC hello.c -o hello.o

 gcc -shared -o libhello.so hello.o

 把动态库的路径加到/etc/ld.so.conf.d

打开方法:

 添加到末尾:

执行ldconfig刷新

 链接库运行:

 

今天的分享到此结束了,希望小伙伴们不要忘记这次的内容,哪里写的有问题的地方希望各个好哥们指正,谢谢各位读者姥爷的观看。咱们下次见。


网站公告

今日签到

点亮在社区的每一天
去签到