C++ 编制Caffe C++;分类示例

C++ 编制Caffe C++;分类示例,c++,machine-learning,neural-network,deep-learning,caffe,C++,Machine Learning,Neural Network,Deep Learning,Caffe,我最近修改了Caffe,我正在尝试重新编译它。但是,我在将简单的g++编译链接到include目录中的.hpp文件时遇到了问题。我知道这是一个基本问题,但我似乎无法解决它-有人能帮我解决如何编译这个程序吗?现在的编译如下所示: g++ -I /home/jack/caffe/include classification.cpp -o classify 但我得到了一个错误: In file included from /home/jack/caffe/include/caffe/common.h

我最近修改了Caffe,我正在尝试重新编译它。但是,我在将简单的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>
在/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,
来自分类。cpp:1:
/home/jack/caffe/include/caffe/util/device_alternate.hpp:34:23:致命错误:cublas_v2.h:没有这样的文件或目录
#包括

我在没有Nvidia GPU的机器上运行此程序,因此当我查看device_alternate.hpp文件时,我意识到这也调用了许多与cuda相关的.hpp文件,但这些文件并不存在。

通常,为了帮助编译器定位头文件,需要在编译行中添加选项:

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

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

简单的方法

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

  • 运行make时不使用pretty print选项(在Makefile.config中提到)。您将能够看到用于构建示例和工具的编译和链接选项。您可以复制和粘贴这些选项(如果使用,还可以对相对路径进行必要的更改)以编译文件
希望这有帮助

编辑 由于op要求一种简单的方法,可以按如下方式进行

这是一个非常简单的示例,我鼓励OP参考完整的在线文档和cmake使用示例

  • 要求
    • Caffe需要使用cmake-相对容易,因为当前的主分支机构有CmakeList和所有定义。使用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\u目录包含标题路径

CMakeLists.txt(最外层)至少需要包含以下内容

现在,项目目录中的以下命令将在
build
文件夹中创建可执行文件
MyProject

mkdir build
cd build
cmake ..
make
然后可以使用
/MyProject(参数)

编辑2

满足使用CMake构建caffe的要求对于这项工作非常重要。您需要使用CMake配置和生成makefile。为此,请使用
cmake gui
ccmake
,以便您可以设置诸如仅CPU\u等选项

您应该在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/
文件。此文件指向caffe的安装位置(这是我们的构建目录)

现在,find_package命令应该在没有错误的情况下为您的其他项目运行。由于您使用的是CMake,您可以将项目文件夹保留在Caffe文件夹之外(最好将其保留在Caffe文件夹之外,因为Caffe的制作过程将尝试构建您的文件,但会失败)


注意:如果错误仍然存在,您可以在cmake配置期间手动设置Caffe\u目录。

将Makefile.config更改为仅设置
CPU:=1

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

/caffe/include/caffe/util/device\u alternate.hpp
中,您有

...

#ifdef CPU_ONLY  // CPU-only Caffe.

...

#else  // Normal GPU + CPU Caffe.

#include <cublas_v2.h>

...

请发布您用于编译的确切命令,以及您收到的错误消息。谢谢Shai,刚刚更新了问题谢谢您的帮助-不幸的是,在找到Caffe.hpp文件后,我似乎发现了一些新的编译错误@JackSimpson您需要向其他工具添加更多的
-I
选项,这次是您的
cuda
包含文件夹。试着看看caffe在编译时使用了什么标志。这很有帮助,但我遇到的一个问题是,我有一个main.cpp程序和两个其他类在它们自己的cpp文件(以及相关的头文件)中。您知道有什么简单的方法可以让我同时编译另外两个文件吗?最好的方法是为每个文件编写一个Makefile/CMakeLists.txt,将它们编译成对象,并将其与main.cpp以及依赖项链接。要了解依赖关系,您可以在Makefile.config中关闭pretty print,并查看在caffe的生成过程中传递给编译示例/工具的标志。是的,我想不出如何用简单的方法来完成。如果我以后知道的话,我会打电话给你。谢谢你的解释!有一件事我有点困惑cmake是怎么找到Caffe的?指令“find_package(Caffe REQUIRED)”或“${Caffe_LIBRARIES}”没有告诉它库在哪里。一旦我在我的计算机上编译了Caffe,我是否为它提供了额外的信息,以将cmake指向它的库所在的位置?通常,每当使用cmake进行构建时,cmake_MODULES_PATH变量都会得到更新,从而使您能够访问CaffeConfig.cmakey定义的包含和库。您可以在主目录中找到一个文件
...

#ifdef CPU_ONLY  // CPU-only Caffe.

...

#else  // Normal GPU + CPU Caffe.

#include <cublas_v2.h>

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