yolov3:C++工程的调用

2021-02-02  本文已影响0人  爱毯子的小狮子

有时候我们需要在C++项目中要调用别的库,对于同是C++的项目,尤其是同是CMake管理的项目很是方便。只要将对方编译好的库和头文件的路径添加到自己的项目里来就行了。

然而当对方是C语言的工程时就有一些麻烦。yolo就是这样一个特例,Redmon大佬使用了最为硬核的C来编写神经网络,还达到了很好的效果。因此将它引入我们的工程是个很好的选择。

通过尝试,C++无法直接调用C编译好的动态库(darknet已经有编译好的libdarknet.so)。我们参考了https://bitbucket.org/ChernyshovYuriy/darknetapp/src/master/的工作查看其CMakeList文件,并对其内容进行了删改与验证,查阅相关资料,了解到一种解决办法是这样的:

1) 使用 extern "C" { <C_functions> } 将所有要用的C语言的函数声明包含进来(声明就行)。其作用是告诉C++文件看到这些函数不要用C++的那套索引机制找函数,还是要按C的方式来。好在darknet有个头文件darknet.h已经帮我们做好了。里面是所有函数的声明,并且用宏定义控制 extern 语句的使用:

#ifdef __cplusplus
    extern "C" {
#endif
<C_functions>
#ifdef __cplusplus
    }
#endif

这样当我们调用其头文件时就可以兼容C++。

2) 环境变量。如果你是在IDE上跑的话记住更改它上面的环境变量。就是配置darknet时候的环境变量。

3) 有些函数要改,主要是文件路径,这一点darknet做的不太好。

上一篇下一篇

猜你喜欢

热点阅读