编译 Caffe C++ 分类示例
Compiling Caffe C++ Classification Example
我最近修改了 Caffe C++ classification example file,我正在尝试重新编译它。但是,我无法将简单的 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)保存在示例文件夹中的目录(比如测试)中
e caffe根目录。
- 运行
make
。这将自动添加必要的 cxxflags 和 ldflags 并编译您的代码并将可执行文件放入 build/examples/test 文件夹中。这也确保设置标志 CPU_ONLY(如 Makefile.config 中所述)
艰难的道路
- 运行 make 没有漂亮的打印选项(在 Makefile.config 中提到)。您将能够看到用于构建示例和工具的编译和 link 选项。您可以复制并粘贴这些选项(如果使用的话,对相对路径进行必要的更改)来编译您的文件
希望这对您有所帮助
编辑
由于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-gui
或 ccmake
,以便您可以设置 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 文件夹之外,因为 caffe 的 make 过程将尝试构建您的文件,但它会失败)
注意:如果仍然报错,可以在cmake配置时手动设置Caffe_DIR
将Makefile.config更改为设置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
我最近修改了 Caffe C++ classification example file,我正在尝试重新编译它。但是,我无法将简单的 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)保存在示例文件夹中的目录(比如测试)中 e caffe根目录。
- 运行
make
。这将自动添加必要的 cxxflags 和 ldflags 并编译您的代码并将可执行文件放入 build/examples/test 文件夹中。这也确保设置标志 CPU_ONLY(如 Makefile.config 中所述)
艰难的道路
- 运行 make 没有漂亮的打印选项(在 Makefile.config 中提到)。您将能够看到用于构建示例和工具的编译和 link 选项。您可以复制并粘贴这些选项(如果使用的话,对相对路径进行必要的更改)来编译您的文件
希望这对您有所帮助
编辑 由于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
.
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-gui
或 ccmake
,以便您可以设置 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 文件夹之外,因为 caffe 的 make 过程将尝试构建您的文件,但它会失败)
注意:如果仍然报错,可以在cmake配置时手动设置Caffe_DIR
将Makefile.config更改为设置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