文档章节

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

二胡艺
 二胡艺
发布于 2017/01/21 20:39
字数 947
阅读 405
收藏 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到自己工程的过程中遇到的问题。

© 著作权归作者所有

共有 人打赏支持
二胡艺
粉丝 4
博文 42
码字总数 12555
作品 0
镇江
程序员
私信 提问
由于引用MFC库导致DllMain重复定义问题解决 error LNK2005

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

西昆仑
2012/04/18
0
1
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
VC2008 ACE 在共享 DLL 中使用 MFC

用VC2008开发基于对话框的程序,要求一定要选中“在共享 DLL 中使用 MFC” 下载了ACE v5.8.0 和 ACE v6.1.8 编译了ACE的DLL版本(ACE.dll ACE.lib)和ACE LIB版本(ACE.lib) 不论用哪个版本...

netwolfer
2013/04/11
464
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
【Visual C++】一些开发心得与调试技巧

自己平时收集的一些技巧与心得,这里分享出来,普及一下知识。 1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General...

长平狐
2012/11/12
77
0

没有更多内容

加载失败,请刷新页面

加载更多

Impala和Hive集成Sentry、Kerberos认证

关于 Kerberos 的安装和 HDFS 配置 kerberos 认证,请参考 HDFS配置kerberos认证。 关于 Kerberos 的安装和 YARN 配置 kerberos 认证,请参考 YARN配置kerberos认证。 关于 Kerberos 的安装和...

hblt-j
8分钟前
0
0
Ubuntu 18.04 PostgreSQL 11 apt 默认安装某些问题解析

首先默认安装软件(本文以PostgreSQL 11.1为例,其他版本类似)。 sudo apt install postgresql-11 等待软件自动安装并完成配置,启动服务。 服务状态如下: vmware@vmware-virtual-machine:...

白豆腐徐长卿
21分钟前
1
0
一步步动手实现高并发的Reactor模型 —— Kafka底层如何充分利用多线程优势去处理网络I/O与业务分发

一、从《Apeche Kafka源码剖析》上搬来的概念和图 Kafka网络采用的是Reactor模式,是一种基于事件驱动的模式。熟悉Java编程的读者应该了解Java NIO提供了Reactor模式的API。常见的单线程Jav...

Anur
25分钟前
1
0
数字信号处理各种处理及图象

https://wenku.baidu.com/view/b1bb67f1f90f76c661371a75.html?sxts=1544696459935

whoisliang
28分钟前
1
0
rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部