我最近修改了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文件,而这些文件并不存在。
答案 0 :(得分:5)
通常,为了帮助编译器找到头文件,您需要在编译行中添加-I /path/to/include/folder
选项:
~$ g++ -I /path/to/caffe/include myfile.cpp
答案 1 :(得分:4)
如果您想在caffe中构建自定义文件,有两种方法
简单方法
make
。这将自动添加必要的cxxflags和ldflags并编译代码并将可执行文件放在build / examples / test文件夹中。这也确保设置标志 CPU_ONLY (如 Makefile.config 中所述)艰难的方式
希望这有帮助
修改强> 由于op要求一种简单的方法,可以按照以下方式完成
这是一个非常最小的例子,我鼓励OP参考完整的在线文档和cmake使用示例。
现在,我假设你有一个如下的项目结构。
-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(最外层)需要在 minimum
中包含以下内容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} )
现在,项目目录中的以下命令将在MyProject
文件夹中创建可执行文件build
。
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的make过程会尝试构建你的文件,但它会失败)
注意:如果错误仍然存在,您可以在cmake配置期间手动设置 Caffe_DIR 。
答案 2 :(得分:1)
更改Makefile.config以设置CPU_ONLY := 1
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1
答案 3 :(得分:0)
在./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,因此在使用CPU_ONLY
进行编译时必须定义-DCPU_ONLY=1
标志
因此完整的编译命令应如下所示
g++ -DCPU_ONLY=1 -I /home/jack/caffe/include classification.cpp -o classify