Windows下 Caffe C++介面的呼叫
Tips:此處是 Windows 下,新增 CPU 版 Caffe 原始碼的 C++ 工程,分為帶原始碼版(學習原始碼)和不帶原始碼版(直接用的),如果不是學習原始碼建議直接看B部分,不用拷貝原始碼過去。並且在安裝過程中如果是連結庫的問題,直接按照報錯提示增刪就可以了。這裡新增的連結庫都是Debug版的,如果要配Release版的直接將庫的名字改成Release版本的庫新增進去就可以了。
A.帶原始碼版
1.拷貝 caffe 檔案到 C++ 專案中
這裡我新建了一個名字是 Caffe_c 的空專案。根據我的上一篇部落格:Windows 下用 build_win.cmd, 直接編譯CPU版caffe,先配置出來 Debug 版的 Caffe。這裡以我電腦中caffe的路徑為例,我的路徑是:F:\Software_download\caffe-windows
caffe-windows/build/install/include/caffe
這個目錄,其中是包含了各種caffe的標頭檔案:
而 caffe-windows/src/caffe
裡面都是和 build/install/include/caffe
中對應的 .cpp 檔案:
為了使用方便,我們先把需要用到的檔案拷貝到 C++ 專案中:
第1步:將 caffe-windows/build/install/include
資料夾拷貝到新建的 C++ 專案中。
第2步:將 caffe-windows/src
資料夾拷貝到新建的 C++ 專案中。
拷貝完以後如圖:
2. 新增 caffe 檔案到 C++ 專案中
然後將控制檯方案設定成 Debug x64 ,為了管理方便,選中我們空白專案的 標頭檔案 -> 點選右鍵 -> 新增 -> 新建篩選項,按照 build/install/include/caffe
目錄的形式新建對應個數的資料夾並重命名,然後依次將 caffe 所有的 .hpp 檔案新增到對應名稱的資料夾中:
注:因為我們這裡不需要使用 test 功能,所以 include 和 src 中與 test 有關的檔案我們都不用新增到專案檔案中。
新增後:
同理,將 caffe-windows/src/caffe
所有的 .cpp 檔案也都新增進對應的原始檔中(目錄結構也和src相同):
3. 配置相關檔案路徑
1.為了方便這裡 OpenCV我們直接用Windows下安裝Caffe 自帶的依賴庫檔案中的 OpenCV,(為3.10版本),這個版本是沒有 opencv_world310d.lib 和 opencv_world310.lib的,所以新增的庫是多個例如:opencv_core310d.lib, opencv_highgui310d.lib等。如果使用的是自己編譯的原始碼,這樣依賴庫直接 新增一個 opencv_world310d.lib 或者 opencv_world310.lib 就可以了。(具體方法見:Windows下 Cmake + VS 編譯 OpenCV 原始碼)
- 選擇專案屬性 -> vc++目錄 -> 包含目錄,新增:
# boost 庫的檔案路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include\boost-1_61
# caffe 其他依賴庫的檔案路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include
# caffe .hpp .cpp 檔案的路徑
D:\Program\vs2015\Caffe_c\include
D:\Program\vs2015\Caffe_c\src
- 選擇專案屬性 -> vc++目錄 -> 庫目錄,新增:
# caffe 依賴庫的路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\lib
# caffe 自帶 OpenCV 庫的路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\x64\vc14\lib
# caffeproto-d.lib 的路徑
F:\Software_download\caffe-windows\build\lib\Debug
- 選擇專案屬性 -> C/C++ -> 前處理器 -> 前處理器定義,新增:
CPU_ONLY
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_DEPRECATE
USE_LMDB
USE_OPENCV
- 選擇專案屬性 -> 連結器 -> 輸入 -> 附加依賴項,新增:
caffe-d.lib
caffeproto-d.lib
libprotobufd.lib
libopenblas.dll.a
libprotobuf-lited.lib
libprotocd.lib
gflagsd.lib
glogd.lib
lmdbd.lib
caffehdf5_cpp_D.lib
caffehdf5_D.lib
caffehdf5_hl_cpp_D.lib
caffehdf5_hl_D.lib
libcaffehdf5_cpp_D.lib
libcaffehdf5_D.lib
libcaffehdf5_hl_cpp_D.lib
libcaffehdf5_hl_D.lib
opencv_core310d.lib
opencv_highgui310d.lib
opencv_imgproc310d.lib
opencv_imgcodecs310d.lib
boost_thread-vc140-mt-gd-1_61.lib
boost_python3-vc140-mt-gd-1_61.lib
4. 編譯生成
在編譯生成時會遇見無法開啟 lib*.lib 檔案的情況:
1.
2.
3.
解決方法: 以圖1中錯誤為例,在boost庫的lib資料夾下(即第3步的boost庫路徑)先找到boost_thread-vc140-mt-gd-1_61.lib
,在同一個資料夾中建立一個副本並重新命名為libboost_thread-vc140-mt-gd-1_61.lib
就行了
解決上述問題後,再生成會遇見,下面這種情況:
這是專案中沒有主函式造成的,我們需要新增一個main函式,完成後,最後生成成功,就可以一步一步除錯caffe程式碼了。:
4.
無法解析的外部符號 NtCreateSection,該符號在函式 mdb_env_map 中被引用
解決方法:
是缺少 ntdll.lib
, 在電腦上搜索此名字的庫檔案,或者從網上下載一個,將路徑新增到 庫目錄
下,並將 ntdll.lib 新增到 專案屬性 -> 連結器 -> 輸入 -> 附加依賴項
中即可。
B. 不帶原始碼版
過程同上,只是不需要將原始碼拷貝過來。
1.配置相關檔案路徑
- 選擇專案屬性 -> vc++目錄 -> 包含目錄,新增:
# boost 庫的檔案路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include\boost-1_61
# caffe 其他依賴庫的檔案路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\include
# caffe .hpp .cpp 檔案的路徑
F:\Software_download\caffe-windows\build\install\include
F:\Software_download\caffe-windows\src
- 選擇專案屬性 -> vc++目錄 -> 庫目錄,新增:
# caffe 依賴庫的路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\lib
#caffe 自帶 OpenCV 庫的路徑
C:\Users\Chris_zhang\.caffe\dependencies\libraries_v140_x64_py35_1.1.0\libraries\x64\vc14\lib
# caffeproto-d.lib 的路徑
F:\Software_download\caffe-windows\build\lib\Debug
- 選擇專案屬性 -> C/C++ -> 前處理器 -> 前處理器定義,新增:
CPU_ONLY
USE_OPENCV
- 選擇專案屬性 -> 連結器 -> 輸入 -> 附加依賴項,新增:
caffe-d.lib
caffeproto-d.lib
libprotobufd.lib
libopenblas.dll.a
libprotobuf-lited.lib
libprotocd.lib
gflagsd.lib
glogd.lib
caffehdf5_cpp_D.lib
caffehdf5_D.lib
caffehdf5_hl_cpp_D.lib
caffehdf5_hl_D.lib
libcaffehdf5_cpp_D.lib
libcaffehdf5_D.lib
libcaffehdf5_hl_cpp_D.lib
libcaffehdf5_hl_D.lib
opencv_core310d.lib
opencv_highgui310d.lib
opencv_imgproc310d.lib
opencv_imgcodecs310d.lib
boost_thread-vc140-mt-gd-1_61.lib
boost_python3-vc140-mt-gd-1_61.lib
然後同上修改boost檔名,在boost庫的lib資料夾下(即第3步的boost庫路徑)先找到boost_thread-vc140-mt-gd-1_61.lib
,在同一個資料夾中建立一個副本並重新命名為libboost_thread-vc140-mt-gd-1_61.lib
就行了,其他同上。
新增一個主函式,直接編譯就可以了。