C++——Linux静态库和动态库的制作(ubuntu18.04)

目录

一、静态库的制作

 1.准备文件

2.gcc获得.o文件

 3.将.o文件打包

二、静态库的使用

1.文件放置

 2.文件编译

三、动态库制作

1.文件准备

2.得到.o结尾的文件 

3.gcc获得动态库

四、动态库的使用

1.文件放置

 2.文件编译

五、解决动态库加载失败问题

1:设置环境变量LD_LIBRARY_PATH

(1).设置环境变量LD_LIBRARY_PATH的值

(2)用户级永久配置

(3)系统及永久配置

2:修改/etc/ld.so.cache

 六、整体流程

1.静态库制作和使用

 2.动态库制作和使用

3.解决动态库加载失败问题


文章中索要的代码文件点击文章顶部下载

一、静态库的制作


图1 静态库的命名规则和制作流程

 1.准备文件

准备一些测试文件.c结尾,并在一个头文件中以api调用

如图,分别有add.c,div.c,mult.c,sub.c,再再head.c中调用,并在main.c中运行 

2.gcc获得.o文件

将add.c,div.c,mult.c,sub.c文件用gcc编译,但是不运行获得.o结尾的文件,如下

 gcc -c add.c div.c mult.c sub.c

 3.将.o文件打包

 ar rcs libstatic.a *.o 

lib是固定前缀,后面是名字,.a为文件后缀,*是通配符,为可以写出每个文件 

获得的所有文件

二、静态库的使用

1.文件放置

将文件包含的头文件include(包含head.h),src(包括上面的几个接口函数),还有lib(包括生成的静态库libstatic.a,放到一个文件夹)

 2.文件编译

gcc main.c -o main -I ./include -l static -L./lib 

解释一下,-I (第一个大写I)是指头文件路径,第二个-l(小写L)指需要那个静态库,后面-L静态库路径,前面两个-l看起来一样,其实不是一个哈 。


 再运行一下就ok

三、动态库制作

1.文件准备

同样需要文件,和静态库一样,这里就不再赘述

2.得到.o结尾的文件 

gcc -c -fpic add.c div.c mult.c sub.c

 -fpic是生成和路径无关的文件,必须要加上

3.gcc获得动态库

gcc -shared *.o -o libdynamic.so

四、动态库的使用

1.文件放置

和静态库一样

 2.文件编译

gcc main.c -o main -I include -l dynamic -L lib

 具体解释和静态库一样

此时生成了可执行文件main
运行一下试试 ./main ,发现报错了

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

这个错误原因是找不到可执行文件,解决这个错误在第五节中

五、解决动态库加载失败问题

执行ldd命令发现动态库路径找不到,第三行

 有三种解决方法,但只推荐其中两种

1:设置环境变量LD_LIBRARY_PATH

(1).设置环境变量LD_LIBRARY_PATH的值

直接在终端运行以下命令:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib

export添加路径,$读取原有的值,:拼接上要加载的动态库路径,再使用ldd查看程序动态库路径是否添加成功,

但是该方法是临时的,因为在终端中配置,退出终端后,再次运行程序又会出错。

(2)用户级永久配置

首先执行cd 进入家目录,然后进入.bashrc文件,将

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib

添加到最后一行,最后执行. .bashrc 或者source .bashrc保存更改


(3)系统及永久配置

sudo vim /etc/profile 在最后一行加入:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib

然后保存更改:source /etc/profile 
注意:如果通过用户级或者其他配置配置后再进行系统配置会出现多个一样的配置,此时,重新连接新窗口,关闭打开的其他所有窗口,再次进入即可

 通过echo读取LD_LIBRARY_PATH的值:echo $LD_LIBRARY_PATH


路径正确 

2:修改/etc/ld.so.cache

因为不能直接修改/etc/ld.so.cache,所以间接修改/etc/ld.so.conf文件
要通过sudo vim /etc/ld.so.conf,进入目录,最后一行加入LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/china/Linux/liaxi/dynamic/library/lib路径,再执行sudo ldconfig保存修改。

还有一种方式是修改/lib/,或者/usr/lib,但是不建议

使用上面有几种当中的任意一种即可,此时再查看一下运行情况:./main

程序正确运行

 六、整体流程

1.静态库制作和使用


 2.动态库制作和使用



3.解决动态库加载失败问题

只展示了第一个中的1,2两种方法,其他都是一样的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值