使用 CUDA7.5 & Ubuntu 16.04 安装 OpenCV3.1 出现奇数错误
Installing OpenCV3.1 with CUDA7.5 & Ubuntu 16.04 has odd error
我刚刚开始使用 CUDA 7.5 全新安装 Ubuntu 16.04,但在安装 OpenCV3.1 时遇到问题。
当我运行 make 时,出现以下错误:
[ 9%] Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_gpu_mat.cu.o
/usr/include/string.h: In function ‘void* __mempcpy_inline(void, const void, size_t)’:
/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
return (char *) memcpy (__dest, __src, __n) + __n;
我在各种(已关闭)github bug/problem讨论帖中找到了解决方案,如下:
In opencv/cmake/OpencvDetectCuda.cmake, change
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
to
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -D_FORCE_INLINES -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
这个解决方案对我有用,但我仍然不明白原来的问题或解决方案。为什么添加标志 -D_FORCE_INLINE 可以解决问题?为什么 string.h 有问题?这是(我认为)正在编译的更稳定的文件之一。我本以为会出现与 CUDA7.5 或 OpenCV3.1 相关的任何错误?
如果我再次看到这个问题,我该如何识别它?
显然,/usr/include/string.h 从 glib2.22 更改为 glibc2.23 (https://fossies.org/diffs/glibc/2.22_vs_2.23/string/string.h-diff.html)。添加的代码位于文件底部,是:
#if defined __USE_GNU && defined __OPTIMIZE__ \
&& defined __extern_always_inline && __GNUC_PREREQ (3,2)
# if !defined _FORCE_INLINES && !defined _HAVE_STRING_ARCH_mempcpy
#undef mempcpy
#undef __mempcpy
#define mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
#define __mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
__extern_always_inline void *
__mempcpy_inline (void *__restrict __dest,
const void *__restrict __src, size_t __n)
{
return (char *) memcpy (__dest, __src, __n) + __n;
}
# endif
#endif
我见过的阻止此新代码触发 memcpy 错误的方法是:
1 注释掉这段代码
2 将 D_FORCE_INLINES 添加到 NVCC 的标志中
(https://github.com/opencv/opencv/issues/6500
Simple replace in opencv/cmake/OpencvDetectCuda.cmake
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
to
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -D_FORCE_INLINES -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
或者,对于类似的错误,将 D_FORCE_INLINES 添加到 cc 的 ccflags(但我现在找不到参考)
现在,我想弄清楚这段代码的作用....
我刚刚开始使用 CUDA 7.5 全新安装 Ubuntu 16.04,但在安装 OpenCV3.1 时遇到问题。
当我运行 make 时,出现以下错误:
[ 9%] Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_gpu_mat.cu.o
/usr/include/string.h: In function ‘void* __mempcpy_inline(void, const void, size_t)’:
/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
return (char *) memcpy (__dest, __src, __n) + __n;
我在各种(已关闭)github bug/problem讨论帖中找到了解决方案,如下:
In opencv/cmake/OpencvDetectCuda.cmake, change
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
to
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -D_FORCE_INLINES -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
这个解决方案对我有用,但我仍然不明白原来的问题或解决方案。为什么添加标志 -D_FORCE_INLINE 可以解决问题?为什么 string.h 有问题?这是(我认为)正在编译的更稳定的文件之一。我本以为会出现与 CUDA7.5 或 OpenCV3.1 相关的任何错误?
如果我再次看到这个问题,我该如何识别它?
显然,/usr/include/string.h 从 glib2.22 更改为 glibc2.23 (https://fossies.org/diffs/glibc/2.22_vs_2.23/string/string.h-diff.html)。添加的代码位于文件底部,是:
#if defined __USE_GNU && defined __OPTIMIZE__ \
&& defined __extern_always_inline && __GNUC_PREREQ (3,2)
# if !defined _FORCE_INLINES && !defined _HAVE_STRING_ARCH_mempcpy
#undef mempcpy
#undef __mempcpy
#define mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
#define __mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
__extern_always_inline void *
__mempcpy_inline (void *__restrict __dest,
const void *__restrict __src, size_t __n)
{
return (char *) memcpy (__dest, __src, __n) + __n;
}
# endif
#endif
我见过的阻止此新代码触发 memcpy 错误的方法是:
1 注释掉这段代码
2 将 D_FORCE_INLINES 添加到 NVCC 的标志中
(https://github.com/opencv/opencv/issues/6500
Simple replace in opencv/cmake/OpencvDetectCuda.cmake
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
to
set(NVCC_FLAGS_EXTRA ${NVCC_FLAGS_EXTRA} -D_FORCE_INLINES -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})
或者,对于类似的错误,将 D_FORCE_INLINES 添加到 cc 的 ccflags(但我现在找不到参考)
现在,我想弄清楚这段代码的作用....