2016-07-07 12 views
-1

CUDA 7.5でUbuntu 16.04をクリーンインストールし始めたばかりで、OpenCV3.1のインストールに問題がありました。CUDA7.5&Ubuntu 16.04でOpenCV3.1をインストールすると奇妙なエラーが発生する

[ 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に問題がありますか?これはコンパイルされているより安定したファイルの1つです(私はそう思います)。私は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 ccのためCCFLAGSに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を追加します(ただし、私は今の参照を見つけることができません)

今、私はこのコードが何をしているのか把握しようとしています....

+0

標準ファイルを変更するのはひどいですが、完全に機能します! – herve

+0

@herve - ええ、nvccのD_FORCE_INLINESフラグを追加するほうが安全だと思います。 – user1245262

+1

D_FORCE_INLINESを追加するだけでは機能しませんでした – herve

関連する問題