2016-07-07 9 views
-1

Ich habe gerade eine saubere Installation von Ubuntu 16.04 mit CUDA 7.5 gestartet und hatte Probleme bei der Installation von OpenCV3.1.Installieren von OpenCV3.1 mit CUDA7.5 & Ubuntu 16.04 hat einen seltsamen Fehler

Wenn ich laufen zu lassen, bekam ich folgende Fehlermeldung:

[ 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; 

ich eine Lösung in verschiedenen (geschlossen) Github Bugs/Problems Diskussions-Threads gefunden, der wie folgt lautet:

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}) 

Diese Lösung funktionierte für mich, aber ich verstehe das ursprüngliche Problem oder die Lösung immer noch nicht. Warum fügt das Hinzufügen des Flags -D_FORCE_INLINE Dinge hinzu? Warum gibt es ein Problem mit string.h? Dies ist (denke ich) eine der stabileren Dateien, die kompiliert werden. Ich hätte erwartet, dass irgendwelche Fehler mit CUDA7.5 oder OpenCV3.1 in Verbindung gebracht werden?

Wenn ich dieses Problem wieder sehe, wie erkenne ich es?

+1

Ubuntu 16.04 ist keine offiziell unterstützte Konfiguration für CUDA 7.5. Die offiziell unterstützten Konfigurationen sind im CUDA 7.5 Linux Installationshandbuch aufgeführt. –

+0

Ich verstehe, dass Ubuntu 16.04 nicht unterstützt wird. Ich frage mich jedoch, wie die Lösung für dieses spezielle Problem bestimmt wurde. – user1245262

Antwort

1

Anscheinend wurde /usr/include/string.h von glib2.22 in glibc2.23 (https://fossies.org/diffs/glibc/2.22_vs_2.23/string/string.h-diff.html) geändert. Der hinzugefügte Code kommt am Ende der Datei und ist:

#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 

Die Möglichkeiten, die ich gesehen habe von Triggern des Memcpy Fehler dieser neuen Code zu stoppen sind:

1 einfach diesen Code auf Kommentar

2 Fügen D_FORCE_INLINES zu Flaggen für 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}) 

oder für ähnliche Fehler, D_FORCE_INLINES Zugabe für cc ccflags (aber ich nun die Referenz nicht finden kann)

Jetzt versuche ich herauszufinden, was dieser Code tut ....

+0

Das Ändern einer Standarddatei ist so schrecklich, aber es funktioniert perfekt! – herve

+0

@herve - yeah, ich denke, nur die D_FORCE_INLINES Flags für nvcc hinzuzufügen ist sicherer. – user1245262

+1

Das Hinzufügen von D_FORCE_INLINES hat für mich nicht funktioniert – herve