Caffe编译失败,因为使用了不支持的gcc编译器版本。

4

我在Caffe编译方面遇到了困难。不幸的是,我没有成功编译它。

我所遵循的步骤

git clone https://github.com/BVLC/caffe.git
cd caffe
mkdir build
cd build
cmake ..
make all

运行make all失败,出现以下错误信息:

[  2%] Building NVCC (Device) object src/caffe/CMakeFiles/cuda_compile.dir/util/cuda_compile_generated_im2col.cu.o
In file included from /usr/include/cuda_runtime.h:59:0,
                 from <command-line>:0:
/usr/include/host_config.h:82:2: error: #error -- unsupported GNU version! gcc 4.9 and up are not supported!
 #error -- unsupported GNU version! gcc 4.9 and up are not supported!
  ^
CMake Error at cuda_compile_generated_im2col.cu.o.cmake:207 (message):
  Error generating /mydir/caffe/build/src/caffe/CMakeFiles/cuda_compile.dir/util/./cuda_compile_generated_im2col.cu.o

软件版本:

  • 操作系统:Debian
  • gcc 版本:5.3.1
  • nvcc 版本:6.5.12
  • cat /proc/driver/nvidia/version 的结果:
NVRM version: NVIDIA UNIX x86_64 Kernel Module  352.63  Sat Nov  7 21:25:42 PST 2015
GCC version:  gcc version 4.8.5 (Debian 4.8.5-3) 

尝试解决问题的方法

第一次尝试

通常简单的解决方案是最好的,所以(如此处建议的那样),我尝试从/usr/include/host_config.h(第82行)中注释掉检查gcc版本的宏。不幸的是,这并没有奏效,编译失败了:

1 catastrophic error detected in the compilation of "/tmp/tmpxft_000069c2_00000000-4_im2col.cpp4.ii".

第二次尝试

我尝试运行:

cmake -D CMAKE_CXX_COMPILER=g++-4.8 ..
make

但是它以完全相同的错误信息失败了(即使应该接受g++-4.8)。

第三次尝试

我找到了一个类似的问题(虽然与Caffe无关),并尝试按照被接受的答案建议的方法解决。

我所做的:

  1. 我运行了 grep -iR "find_package(CUDA" caffe 命令,找到了 Cuda.cmake 文件,在第 225 行有 find_package(CUDA 5.5 QUIET)
  2. 我在 Cuda.cmake 中的 find_package(CUDA 5.5 QUIET) 前一行添加了 set(CUDA_HOST_COMPILER /usr/bin/gcc-4.8)
  3. 我清空了 build 目录中的所有内容,并重新运行了 cmakemake 命令,包括和不包括 -D CMAKE_CXX_COMPILER=g++-4.8

不幸的是,结果完全相同。Caffe 可能以某种方式覆盖了它 - 我还没想出来 怎么

make VERBOSE=1 2>&1 | grep -i compiler-bindir 返回空值。

有趣的是,make VERBOSE=1 打印失败的命令,即:

/usr/bin/nvcc -M -D__CUDACC__ /mydir/caffe/src/caffe/util/im2col.cu -o /mydir/caffe/build/src/caffe/CMakeFiles/cuda_compile.dir/util/cuda_compile_generated_im2col.cu.o.NVCC-depend -ccbin /usr/bin/cc -m64 -DUSE_LMDB -DUSE_LEVELDB -DUSE_OPENCV -DWITH_PYTHON_LAYER -DGTEST_USE_OWN_TR1_TUPLE -Xcompiler ,\"-fPIC\",\"-Wall\",\"-Wno-sign-compare\",\"-Wno-uninitialized\",\"-O3\",\"-DNDEBUG\" -gencode arch=compute_20,code=sm_21 -Xcudafe --diag_suppress=cc_clobber_ignored -Xcudafe --diag_suppress=integer_sign_change -Xcudafe --diag_suppress=useless_using_declaration -Xcudafe --diag_suppress=set_but_not_used -Xcompiler -fPIC -DNVCC -I/usr/include -I/mydir/caffe/src -I/usr/include -I/mydir/caffe/build/include -I/usr/include/hdf5/serial -I/usr/include/opencv -I/usr/include/atlas -I/usr/include/python2.7 -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/mydir/caffe/include -I/mydir/caffe/build

当我手动添加--compiler-bindir /usr/bin/gcc-4.8标志时,它会打印错误:
nvcc fatal   : redefinition of argument 'compiler-bindir'

这可能与 this 错误报告有关。

编辑:我没有注意到 --compiler-bindir-ccbin 是相同的选项,而后者已经在上述失败的命令中设置。当我将 -ccbin /usr/bin/cc 改为 -ccbin /usr/bin/gcc-4.8 后,上述命令成功完成。现在我需要找到 Caffe 的 CMake 文件中覆盖所有后续 Caffe 的 CMakes 中的 -ccbin 的选项。看一下 cmake/Cuda.cmake:252:list(APPEND CUDA_NVCC_FLAGS ${NVCC_FLAGS_EXTRA} 似乎是个好方法。


我如何成功完成编译?感谢任何帮助。

相关的SO问题:


1
你似乎混淆了gcc编译器和nvcc编译器(GPU代码编译器)。请尝试确定问题所在:是编译CPU代码还是GPU代码?如果在Makefile.config中定义CPU_ONLY := 1,会发生什么?你能否构建仅限于CPU的caffe版本? - Shai
1
如果您想使用CUDA 6.5,请从官方支持CUDA 6.5的操作系统/发行版(<-点击并阅读文档,特别是1.1节和表1)开始,并且不要对gnu/gcc/g++进行任何更新。 - Robert Crovella
@Shai 在上面的帖子中,我粘贴了/usr/bin/nvcc -M -D__CUDACC__ (...)命令,导致出现错误消息。这行明确说明问题涉及Caffe编译过程中运行的GPU编译。据我所知,在Linux上,nvcc内部使用gcc。请参见nvcc --help以查看--compiler-bindir-ccbin)参数描述。 - patryk.beza
@RobertCrovella 这里没有Debian(http://developer.download.nvidia.com/compute/cuda/6_5/rel/docs/CUDA_Getting_Started_Linux.pdf)。真遗憾。;( - patryk.beza
2个回答

7

cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.8" .. && make 可以导致编译成功


现在又出现了另一个问题:链接 Google 的 libgflagslibprotobuf 失败,可能是由于它是使用更新的 gcc 版本编译的,但这与所要求的问题无关。


1
我的电脑运行Ubuntu 15.10,我的默认编译器版本是gcc 5.2.1。
在文件的第115行注释掉#error指令。
/usr/local/cuda-7.5/include/host_config.h 

"

(或者您系统上的路径) 对我很有帮助。Caffe编译成功,所有测试都运行顺畅。

另一方面,如果选择忽略这一点,并继续使用一个编译器版本编译项目的一部分,用另一个编译器版本编译项目的另一部分(对我来说是gcc-4.8和gcc-5.2.1),链接问题将会出现。另一个答案提到的protobuf和libgflags的链接问题与此有关。

"

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