文档章节

c++工程中使用caffe.lib常见的错误及解决方法

二胡艺
 二胡艺
发布于 2017/01/21 20:39
字数 947
阅读 302
收藏 0

下载最新的caffe源码,执行$(CAFFE_ROOT)/script/build_win.cmd。 在编译好caffe 后,引入自己的工程中,稍有不注意的地方就会出现各种烦心问题。这里做一个归类
(1)boost库问题
(2)预定义宏
(3)未知的Layer 类型

>>boost库问题
参照原caffe-windows的classification工程配置好caffe及caffe所依赖的第三方库(glog,lmdb,opencv,....)的include,lib目录,在"链接器"->“输入”同样写上依赖的.lib文件。以上配置完后,理论上是可以通过编译了,但是,这个时候出现了:无法打开“libboost_date_time-vc-140-mt-gd-1_59.lib”,搜索了很多的结果,答案都是说重新编译boost,我自己也重新编译了还是不行,也有说把"项目属性"->“C++”->"代码生成"的“/MDd” 改成“/MTd”,无奈还是无法解决问题。无意中注意到自己重新编译的boost中有两个文件名很相似的.lib文件libboost_date_time-vc-140-mt-gd-1_59.lib和boost_date_time-vc-140-mt-gd-1_59.lib,又对比了$(CAFFE_ROOT)/script/build/libraries/lib中关于boost的.lib文件只提供了一个。于是,对比了一下这两个文件的异同。原来libboost_date_time-vc-140-mt-gd-1_59.lib 是用于静态编译的,而boost_date_time-vc-140-mt-gd-1_59.lib是用于动态编译的。

那么问题是,明明自己在“链接器”中的“输入”填写的是不带“lib”的库,为什么编译的时候会提示“无法打开“libboost_date_time-vc-140-mt-gd-1_59.lib””? 经过千辛万苦终于在http://stackoverflow.com/questions/16056461/linking-error-ambiguous-libboost-lib-vs-boost-lib 找到一点蛛丝马迹。大致意思是需要在vs 中定义一个宏 BOOST_ALL_NO_LIB告诉编译器,在编译的时候自动去检索存在的库。那么再对比一个原caffe-windows的classification工程是怎么写的。果然,在”工程属性“->"c++"->”预处理器“发现了关于boost的宏
BOOST_ALL_NO_LIB
BOOST_NO_CXX11_TEMPLATE_ALIASES
接着也同样给自己的工程添加这两个宏,再执行编译。关于提示无法打开“libboost_date_time-vc-140-mt-gd-1_59.lib”的问题得以解决!!

>>预定义宏
以上添加的关于boost的宏已经得到解决,但是如果只加上面的两个宏,编译还是有其他的错误,一般是关于google::glog的一些符号无法解析。参照刚才的方法我们索性把classification中定义的宏全部copy过去。即 CAFFE_VERSION=1.0.0-rc3
BOOST_ALL_NO_LIB
BOOST_NO_CXX11_TEMPLATE_ALIASES
USE_LMDB
USE_LEVELDB
USE_CUDNN
USE_OPENCV
WITH_PYTHON_LAYER
CMAKE_WINDOWS_BUILD
GLOG_NO_ABBREVIATED_SEVERITIES
GOOGLE_GLOG_DLL_DECL=__declspec(dllimport)
GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=__declspec(dllimport)
H5_BUILT_AS_DYNAMIC_LIB=1
CMAKE_INTDIR="Debug"
在自己的工程中添加上述的宏这时编译基本可以全部通过了。

>>未知的Layer 类型(Unknown Layer Type)
编译通过了之后就可以执行了,这里使用的是bvlc_googlenet的模型。在初始化Net后触发了一个错误,程序直接挂了->”Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type“。提示居然不认识”InputLayer“了,这明显不可能,在源码中已经有相应实现了。这个问题的解决方案可以参考http://blog.csdn.net/fangjin_kl/article/details/50936952 做的主要是在自己工程添加一个myheader.hpp的文件,内容如下:

#include "caffe/common.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
#include "caffe/layers/concat_layer.hpp"

namespace caffe
{
	extern INSTANTIATE_CLASS(InputLayer);
	extern INSTANTIATE_CLASS(InnerProductLayer);
	extern INSTANTIATE_CLASS(DropoutLayer);
	extern INSTANTIATE_CLASS(ConvolutionLayer);
	extern INSTANTIATE_CLASS(ReLULayer);
	extern INSTANTIATE_CLASS(PoolingLayer);
	extern INSTANTIATE_CLASS(LRNLayer);
	extern INSTANTIATE_CLASS(SoftmaxLayer);
	extern INSTANTIATE_CLASS(ConcatLayer);
}

具体每个人可能不一样,哪一个Layer没有注册就添加一个REGISTER_LAYER_CLASS(XXXX);重复就删掉;哪一个没有实例化,就加一个extern INSTANTIATE_CLASS(X'X'XX);

以上这三个问题是移植caffe.lib到自己工程的过程中遇到的问题。

© 著作权归作者所有

共有 人打赏支持
二胡艺
粉丝 3
博文 42
码字总数 12555
作品 0
镇江
程序员
WINDOWS.H already included. MFC apps must not #i

场景 在win32工程中,使用MFC,选择MFC的使用方式:在共享 DLL 中使用 MFC,在调用CString的时候,出现如下的错误: c:program files (x86)microsoft visual studio 14.0vcatlmfcincludeafxv...

fengyuzaitu
04/13
0
0
android开发教程(3)— jni编程之采用SWIG从Java调用C/C++

Android 从Java调用C/C++ 当无法用 Java 语言编写整个应用程序时,JNI 允许您调用C/C++本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、更快的编程语言C/C++去实现对时...

刘小米
2014/09/16
0
0
fatal error C1010: unexpected end of file while...

在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive 的错误. 解决方法: 1、如果发生错误的文件是由其他的C代码文件添加进入当...

Mr&Cheng
2013/01/20
0
0
由于引用MFC库导致DllMain重复定义问题解决 error LNK2005

最近在做一个项目,有个工程叫COMMUtil(DLL工程).原本该项目中用的都是STL中的类。现在由于用了一个第三方的一个日志工具,里面用到了CString等MFC提供的类,所有要加上对MFC的引用。 将原...

西昆仑
2012/04/18
0
1
.a .framework打包注意事项

静态库中使用了C++混编 我们都知道在OC项目中使用了C++文件来混编的话,就会报如图所示的错误。其最快捷的解决方法就是将项目中的一个文件的.m后缀改成.mm。 如果在制作静态库时也使用了C++...

_故事的小黄瓜_
05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中的移位运算符

国庆给自己放了个小长期二十几天,回来继续更新专栏 上一篇文章我们说了Java里的二进制,知道了计算机是以0和1来处理数据的,在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号...

SuShine
33分钟前
2
0
linux版QQ

下载地址在这 http://yun.tzmm.com.cn/index.php/s/XRbfi6aOIjv5gwj Appimage包不用做什么别的处理,安装啥的都不需要。。找到文件所在目录,终端中修改一下文件的权限 chmod 777 QQ-2017112...

悲催的古灵武士
39分钟前
1
0
咕泡-MyBatis 实用篇作业

1. Mapper在spring管理下其实是单例,为什么可以是一个单例? 首先,mapper 内部不包含 成员字段,无状态单例是安全的 另外,一直存在不用每次调用都new 一个新实例 2. MyBatis在Spring集成下...

职业搬砖20年
42分钟前
2
0
MQTT协议的初浅认识之连接建立

MQTT百科 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布...

亚林瓜子
59分钟前
1
0
OpenStack部署都有哪些方式

对于每一个刚接触到OpenStack的新人而言,安装无疑是最困难的,同时这也客观上提高了大家学习OpenStack云计算的技术门槛。想一想,自己3年前网上偶然接触到OpenStack时,一头茫然,手动搭建一...

tututu_jiang
59分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部