问题是这样的,自己的代码实现了一个数据分类的功能,如何把这部分代码完全打包成动态库和头文件,提供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上