编译Caffe c++分类示例

Compiling Caffe C++ Classification Example

本文关键字:分类 c++ Caffe 编译      更新时间:2023-10-16

我最近修改了Caffe c++分类示例文件,我正试图重新编译它。但是,我在链接一个简单的g++编译到include目录中的.hpp文件时遇到了麻烦。我知道这是一个基本的问题,但我似乎不能解决它——有人能帮我解决如何编译这个程序吗?现在编译看起来像这样:

g++ -I /home/jack/caffe/include classification.cpp -o classify

但是我得到这个错误:

In file included from /home/jack/caffe/include/caffe/common.hpp:19:0,
    from /home/jack/caffe/include/caffe/blob.hpp:8,
    from /home/jack/caffe/include/caffe/caffe.hpp:7,
    from classification.cpp:1:
/home/jack/caffe/include/caffe/util/device_alternate.hpp:34:23: fatal error: cublas_v2.h: No such file or directory
 #include <cublas_v2.h>

我在一台没有Nvidia gpu的机器上运行这个,所以当我查看device_alternate.hpp文件时,我意识到这正在调用许多与cuda相关的。hpp文件,这些文件也不存在。

通常,为了帮助编译器定位头文件,您需要在编译行中添加-I /path/to/include/folder选项:

~$ g++ -I /path/to/caffe/include myfile.cpp

如果您想在caffe中构建自定义文件,有两种方法

简单方法

  • 进行必要的更改,并将文件(在您的示例中是classification.cpp)保存在目录(例如test)中的示例文件夹中
  • 运行make。这将自动添加必要的cxxflags和ldflags,并编译代码,并将可执行文件放在build/examples/test文件夹中。这也确保设置了标志CPU_ONLY(如Makefile中所述)。配置)

The Hard way

  • 运行make,没有漂亮的打印选项(在Makefile中提到)。配置)。您将能够看到用于构建示例和工具的编译和链接选项。您可以复制并粘贴这些选项(如果使用的话,还可以对相对路径进行必要的更改)来编译文件

希望有帮助

编辑由于op请求了一种简单的方法,它可以按如下方式完成

这是一个非常最小的示例,我建议OP参考完整的在线文档和cmake使用示例。

  • 需求
    • Caffe需要使用cmake构建-相对容易,因为当前主分支有CMakeLists和所有定义。使用Cmake-gui或ccmake来设置您的选项

现在,我假设您有如下的项目结构:

-project  
    - src  
         - class1.cpp
         - CMakeLists.txt ( to be added )
    - include
         - class1.hpp
    - main.cpp
    - CMakeLists.txt ( to be added )

CMakeLists.txt (src)需要包含(至少)以下行,

cmake_minimum_required(VERSION 2.8)
find_package(OpenCV REQUIRED) # Optional in case of dependency on opencv 
add_library( c1 class1.cpp )

注意:如果class1依赖于其他外部库,则必须使用include_directories包含headers的路径。

CMakeLists.txt(最外层)需要在最小

包含以下内容
cmake_minimum_required(VERSION 2.8)
PROJECT(MyProject)
find_package(OpenCV REQUIRED)
find_package(Caffe REQUIRED)
include_directories( "${PROJECT_SOURCE_DIR}/include" )
add_subdirectory( src )
include_directories( "$Caffe_INCLUDE_DIRS}" )
add_executable(MyProject main.cpp)
target_link_libraries( MyProject ${OpenCV_LIBS} c1 ${Caffe_LIBRARIES} )    
现在,在项目目录中执行以下命令将在build文件夹中创建可执行的MyProject
mkdir build
cd build
cmake ..
make

你可以用./MyProject (arguments)

运行你的程序

编辑2

满足使用CMake构建caffe的要求对于此工作非常重要。您需要使用CMake配置和生成makefile。使用cmake-guiccmake用于此目的,以便您可以设置CPU_ONLY等选项。

您应该在caffe中创建一个构建目录,并执行以下操作来进行基本设置

mkdir build
cd build
cmake ..
make -jX #X is the number of threads your CPU can handle

现在,$HOME文件夹中的.cmake目录包含以下内容/home/user/.cmake/packages/Caffe/<random_string>文件。这个文件指向caffe的安装位置(也就是我们的构建目录)

现在,find_package命令应该在您的其他项目中正常运行。因为你正在使用CMake,你可以把你的项目文件夹放在Caffe文件夹之外(最好把它放在外面,因为Caffe的make过程会尝试构建你的文件,但它会失败)

注意:如果错误仍然存在,您可以在cmake配置时手动设置Caffe_DIR

更改Makefile。设置CPU_ONLY := 1

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

./caffe/include/caffe/util/device_alternate.hpp

...
#ifdef CPU_ONLY  // CPU-only Caffe.
...
#else  // Normal GPU + CPU Caffe.
#include <cublas_v2.h>
...

这意味着它将尝试包含cublas_v2.h,除非定义了CPU_ONLY标志。

由于您的机器没有Nvidia GPU,您必须在编译时使用-DCPU_ONLY=1定义CPU_ONLY标志

所以完整的编译命令应该看起来像
g++ -DCPU_ONLY=1 -I /home/jack/caffe/include classification.cpp -o classify