编译Caffe C++分类示例

9

我最近修改了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文件,但这些文件并不存在。


1
请提供您正在使用的编译命令以及您收到的错误信息。 - Shai
谢谢Shai,我刚刚更新了问题。 - Jack Simpson
4个回答

6

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

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

谢谢您的帮助 - 不幸的是,一旦它找到了Caffe .hpp文件,我发现了一些新的编译错误! - Jack Simpson
1
@JackSimpson 你需要为其他工具添加更多的-I选项,这次是你的cuda包含文件夹。尝试查看编译时caffe正在使用哪些标志。 - Shai

4
如果您想在caffe中构建自定义文件,有两种方法:
简单的方法
- 进行必要的更改并将文件(在您的情况下是classification.cpp)保存在位于caffe根目录下的examples文件夹中的一个目录中(例如test)。 - 运行“make”。这将自动添加必要的cxxflags和ldflags,并编译您的代码并将可执行文件放置在build/examples/test文件夹中。这也确保设置了标志CPU_ONLY(如Makefile.config中所述)。
困难的方法
- 运行没有漂亮打印选项的make(在Makefile.config中提到)。您将能够看到用于构建示例和工具的编译和链接选项。您可以复制并粘贴这些选项(并根据需要更改相对路径)来编译您的文件。
希望这可以帮助您。
编辑
由于op请求一种简单的方法,因此可以按照以下方式完成:
这是一个非常简单的示例,我鼓励OP参考完整的在线文档和cmake使用示例。
要求
- 必须使用cmake构建Caffe - 相对容易,因为当前的主分支已经定义了CMakeLists和所有内容。使用Cmake-gui或ccmake设置您的选项。
现在,我假设您的项目结构如下。
-project  
    - src  
         - class1.cpp
         - CMakeLists.txt ( to be added )
    - include
         - class1.hpp

    - main.cpp
    - CMakeLists.txt ( to be added )
文件(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} )    

现在,在项目目录中执行以下命令,将创建可执行文件MyProject并保存在build文件夹中。
mkdir build
cd build
cmake ..
make

您可以使用./MyProject (arguments)运行您的程序。 编辑2 满足使用CMake构建caffe的要求非常重要,这对于程序正常运行至关重要。您需要使用CMake配置和生成Makefiles。 使用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的制作过程会尝试构建你的文件,但会失败)。
注意:如果错误仍然存在,你可以手动设置Caffe_DIR,进行cmake配置。

非常有帮助,但我遇到的一个问题是我有一个main.cpp程序和两个其他类在它们自己的cpp文件中(以及相关的头文件)。你知道是否有一种简单的方法可以让这两个文件一起编译吗? - Jack Simpson
1
最好的方法是为每个文件编写一个Makefile / CMakeLists.txt,将它们编译成对象,并将其与依赖项一起链接到main.cpp。要知道依赖关系,可以在Makefile.config中关闭漂亮打印并查看传递给caffe制作过程中编译示例/工具的标志。是的,我想不出有什么简单的方法可以做到这一点。也许如果我以后知道了,我会联系你。 - ImgPrcSng
1
通常情况下,使用cmake构建时,CMAKE_MODULES_PATH变量会得到更新,从而使您可以访问由CaffeConfig.cmake定义的包含文件和库。 - ImgPrcSng
1
你可以在你的主目录(~/.cmake/)中找到一个文件,其中包含有关caffe和构建目录路径的信息,其中包含CaffeConfig.cmake。 - ImgPrcSng
我尝试在主目录下使用ls -a和cat命令查看.cmake文件,但不知何故它并不存在(我正在使用Ubuntu系统)。 - Jack Simpson
显示剩余3条评论

1

修改Makefile.config文件,将CPU_ONLY := 1设置为1。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接