静态库与动态库的使用

简单介绍

静态库通常以.a为后缀,文件命名格式为libxxx.a,其中xxx就是静态库的名称。我们在链接静态库的时候,静态库的内容会被编译到我们的工程中,我们在运行程序的时候就不在需要该静态库文件,可执行文件比较大。动态库通常以.so为后缀,文件命名格式为libxxx.so,其中xxx为动态库的名称。动态库和静态库的最大区别在于动态库是在程序运行过程中被需要的,我们在编译代码的时候,并没有将动态库中的内容编译到项目中,这样可执行文件就会比较小,所以我们代码运行的环境中需要动态库文件的存在。

创建静态库
  1. 创建文件,编写程序
    我创建了三个文件,分别为 1.c , 1.h , main.c 。
    1.c 内容
    #include <stdio.h>
    #include "./1.h"
    
    void DisplayStr(const char *p_str)
    {
        printf("%s", p_str);
    }
    
    1.h 内容
    #ifndef __1_H__
    #define __1_H__
    
    void DisplayStr(const char *p_str);
    
    #endif //__1_H__
    
    main.c 内容
    #include <stdio.h>
    #include "1.h"
    
    int main(int argc, char const *argv[])
    {
        DisplayStr("hello world\r\n");
        return 0;
    }
    
  2. 生成.o文件
    gcc -o 1.o -c 1.c
    
  3. 生成静态库
    ar -rcs libdis.a 1.o
    
    这样我们就得到了由 1.c 生成的静态库文件 libdis.a。
使用静态库

有两种方式可以使用静态库

  1. 在编译的时候加上库文件

    gcc main.c ./libdis.a -o test
    
  2. 通过参数指定我们想要链接的库文件

    gcc main.c -o test -L . -ldis
    

    这里 -L指定库文件所在的位置;-l指向静态库名称。

    执行test文件,屏幕打印 hello world

创建动态库
  1. 创建文件,编写程序
    这里我们就使用上面创建的三个文件。
  2. 生成动态库
    gcc -fpic -c 1.c	//生成目标文件 1.o
    gcc -shared -o libdis.so 1.o
    
    上面的两条命令可以合成一条执行
    gcc -fpic -shared 1.c -o libdis.so
    
使用动态库
gcc -o test main.c -L ./ -ldis

这时候会报错:

./test: error while loading shared libraries: libdis.so: cannot open shared object file: No such file or directory

这是因为程序没有找到动态库,在运行时,动态库需要被放在系统目录下。我们将libdis.so文件移动到linux系统lib文件夹,程序就可以正常运行。还有一种设置环境变量的方法:export LD_LIBRARY_PATH=’pwd’:$LD_LIBRARY_PATHpwd代表动态库所在的路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值