linux 代码封装成静态库和动态库使用(待续)

16 篇文章 0 订阅

问题是这样的,自己的代码实现了一个数据分类的功能,如何把这部分代码完全打包成动态库和头文件,提供API给别人调用呢?

 

如果没有使用其它的依赖库或者其它开源代码,那么可以直接按照gcc编译器生成和使用静态/动态库的方式。可以参考博客:

 

https://blog.csdn.net/arackethis/article/details/43340065

 

按照这篇博客里面的操作,基本可以完成自己生成静态库和动态库,提供库和头文件,即可以API的方式提供给别人调用了。

 

但是如果使用其它的开源代码,有太多的依赖,应该怎么办呢?(这里的问题是这样子的,使用caffe实现了分类的算法,想把这部分完全打包提供给其他人使用,那么其他人只需要看见我提供给他的.h接口文件,以及相应的所有so库就行。)

 

具体流程如下,首先需要编译caffe,得到在build/lib/libcaffe.so.xxx的文件,将该文件和需要提供给其他人使用的.h文件提取出来。

写main函数main.cpp

#include “xxx.h”

 

void main(){

                xxxx;

}

再利用gcc编译,使用如下命令 g++ -o output main.cpp -L ./lib –lcaffe (细节可以参考前面的博客)

 

编译会报错,提示很多的文件找不到,是因为缺少对应的so库。

想办法把所有依赖的so库提取出来,编译的时候,把所有需要的so库全部加上(但是这里如何找到所有需要的so库呢?我这里采用的方式先编译出一个可执行文件,然后执行该文件时就会提示缺少哪个文件,我一共找了90多个,比较不智能)

比如:

g++ -o sayheke main.cpp -L ./lib -lcaffe -latk-1.0-lgstbase-0.10 –lavcodec

 

但是有时候可能会和系统的一些库重合,会报一些错。再看下如何解决这个问题。

这里碰到的问题是 /usr/lib/ld cannot find libxxx

这里查了一下,我这里需要的so库在./lib里面都是存在的,为什么还会报这种错误呢?

实践发现,问题应该跟so库的链接有关,把所有提示cannot find的库,全部.so后面的内容去掉。

比如 mv libxxx.so.x.x libxxx.so,改一下lib的名称即可

这里可以选择把所有的lib库文件全都改名为xxx.so

再次编译即可完成


这里通过改名称,全都改为xxx.so后,编译的可以正常编译了,但是却碰到了运行时,再在这个库里面找的时候,却是要找.so.xx.xx的文件,我这里选择保存两个lib库使用。但是感觉应该还是so库的链接问题。

既提供.so,也提供.so.xx.xx的方式是可行的,但是其实更好的方式是,增加软链接,将.so软链接到.so.xx.xx上




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值