2016-07-07 90 views
-1

我剛開始使用CUDA 7.5安裝Ubuntu 16.04,並在安裝OpenCV3.1時遇到問題。使用CUDA7.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的錯誤/問題的討論主題的解決方案,這是如下:

​​

這個解決方案適用於我,但我仍然不理解最初的問題或解決方案。爲什麼添加標誌-D_FORCE_INLINE修復了一些事情?爲什麼string.h有問題?這是(我認爲)正在編譯的更穩定的文件之一。我會期待任何與CUDA7.5或OpenCV3.1相關的錯誤?

如果我再次看到此問題,我該如何識別它?

+1

Ubuntu 16.04不是CUDA 7.5正式支持的配置。 CUDA 7.5 Linux安裝指南中列出了官方支持的配置。 –

+0

我知道Ubuntu 16.04不支持。我想知道的是,如何確定這個特定問題的解決方案。 – user1245262

回答

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到CCFLAGS爲CC(但現在我無法找到參考)

現在,我試圖弄清楚這段代碼的作用......

+0

修改標準文件非常糟糕,但它完美地工作! – herve

+0

@herve - 是的,我認爲只需爲nvcc添加D_FORCE_INLINES標誌更安全。 – user1245262

+1

只需添加D_FORCE_INLINES對我無效 – herve