2017-02-25 41 views
6

Chcę zbudować opencv 3.2 z cuda 8 i mam zainstalowane wszystkie wymagane biblioteki do cuda w moim systemie Linux, który jest Debian 9 testing (stretch) 4.9.0-1-amd64 po wygenerowaniu plików Makeup z cmake pomyślnie otrzymuję błąd powiązania wielokrotnej definicji, wykonując polecenie make. Próbowałem wielu konfiguracji z cmake, a także sprawdziłem prawie wszystkie powiązane problemy na wielu forach, ale nie mogłem znaleźć żadnego rozwiązania. W cmake, zmieniłem CUDA kompilator gcc-5 od CUDA 8 wymaga gcc nie później niż w wersji 5 i kompilator domyślny gcc w wersji 6.3 Oto moje wyjście konfiguracja CUpewnij:Źródło OpenCv skompilowane z cuda generuje błąd łącza wielokrotnej definicji

OpenCV modules: 
    To be built:     cudev core cudaarithm flann imgproc ml video cudabgsegm cudafilters cudaimgproc cudawarping imgcodecs photo shape videoio cudacodec highgui objdetect ts features2d calib3d cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo java stitching superres videostab python2 python3 
    Disabled:     world 
    Disabled by dependency:  - 
    Unavailable:     viz 

    GUI: 
    QT 5.x:      YES (ver 5.7.1) 
    QT OpenGL support:   YES (Qt5::OpenGL 5.7.1) 
    OpenGL support:    YES (/usr/lib/x86_64-linux-gnu/libGLU.so /usr/lib/x86_64-linux-gnu/libGL.so) 
    VTK support:     NO 

    Media I/O: 
    ZLib:      /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.8) 
    JPEG:      /usr/lib/x86_64-linux-gnu/libjpeg.so (ver) 
    WEBP:      build (ver encoder: 0x020e) 
    PNG:       /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.6.28) 
    TIFF:      /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 - 4.0.7) 
    JPEG 2000:     /usr/lib/x86_64-linux-gnu/libjasper.so (ver 1.900.1) 
    OpenEXR:      /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so (ver 2.2.0) 
    GDAL:      NO 
    GDCM:      NO 

    Video I/O: 
    DC1394 1.x:     NO 
    DC1394 2.x:     YES (ver 2.2.5) 
    FFMPEG:      YES 
     avcodec:     YES (ver 57.64.101) 
     avformat:     YES (ver 57.56.101) 
     avutil:     YES (ver 55.34.101) 
     swscale:     YES (ver 4.2.100) 
     avresample:    YES (ver 3.1.0) 
    GStreamer:     NO 
    OpenNI:      NO 
    OpenNI PrimeSensor Modules: NO 
    OpenNI2:      NO 
    PvAPI:      NO 
    GigEVisionSDK:    NO 
    Aravis SDK:     NO 
    UniCap:      NO 
    UniCap ucil:     NO 
    V4L/V4L2:     NO/YES 
    XIMEA:      NO 
    Xine:      NO 
    gPhoto2:      YES 

    Parallel framework:   TBB (ver 4.3 interface 8006) 

    Other third-party libraries: 
    Use IPP:      9.0.1 [9.0.1] 
     at:      /home/user/opencv_build/3rdparty/ippicv/ippicv_lnx 
    Use IPP Async:    NO 
    Use VA:      NO 
    Use Intel VA-API/OpenCL:  NO 
    Use Lapack:     NO 
    Use Eigen:     YES (ver 3.3.2) 
    Use Cuda:     YES (ver 8.0) 
    Use OpenCL:     YES 
    Use OpenVX:     NO 
    Use custom HAL:    NO 

    NVIDIA CUDA 
    Use CUFFT:     YES 
    Use CUBLAS:     YES 
    USE NVCUVID:     NO 
    NVIDIA GPU arch:    20 30 35 37 50 52 60 61 
    NVIDIA PTX archs: 
    Use fast math:    YES 

    OpenCL:      <Dynamic loading of OpenCL library> 
    Include path:    /home/user/git/opencv/opencv/3rdparty/include/opencl/1.2 
    Use AMDFFT:     NO 
    Use AMDBLAS:     NO 

    Python 2: 
    Interpreter:     /usr/bin/python2.7 (ver 2.7.13) 
    Libraries:     /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.13) 
    numpy:      /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.12.0) 
    packages path:    lib/python2.7/dist-packages 

    Python 3: 
    Interpreter:     /usr/bin/python3 (ver 3.5.3) 
    Libraries:     /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.3) 
    numpy:      /usr/lib/python3/dist-packages/numpy/core/include (ver 1.12.0) 
    packages path:    lib/python3.5/dist-packages 

    Python (for build):   /usr/bin/python2.7 

    Java: 
    ant:       /usr/bin/ant (ver 1.9.8) 
    JNI:       /usr/lib/jvm/java-8-openjdk-amd64/include /usr/lib/jvm/java-8-openjdk-amd64/include/linux /usr/lib/jvm/java-8-openjdk-amd64/include 
    Java wrappers:    YES 
    Java tests:     NO 

    Matlab:      Matlab not found or implicitly disabled 

    Documentation: 
    Doxygen:      /usr/bin/doxygen (ver 1.8.13) 

    Tests and samples: 
    Tests:      NO 
    Performance tests:   NO 
    C/C++ Examples:    YES 

    Install path:     /usr/local 

i tu jest wyjście polecenia make

[ 10%] Built target libwebp 
[ 10%] Built target opencv_cudev 
[ 14%] Built target opencv_core 
[ 14%] Linking CXX shared library ../../lib/libopencv_cudaarithm.so 
CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_absdiff_scalar.cu.o:(.bss+0xd090): multiple definition of `cv::cudev::color_cvt_detail::c_RGB2YUVCoeffs_f' 
CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_absdiff_mat.cu.o:(.bss+0xd090): first defined here 
CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_absdiff_scalar.cu.o:(.bss+0xd070): multiple definition of `cv::cudev::color_cvt_detail::c_RGB2YUVCoeffs_i' 
CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_absdiff_mat.cu.o:(.bss+0xd070): first defined here 
..... 
..... 
CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_transpose.cu.o:(.bss+0x0): multiple definition of `cv::cudev::color_cvt_detail::c_LabCbrtTab' 
CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_absdiff_mat.cu.o:(.bss+0x0): first defined here 
collect2: error: ld returned 1 exit status 
modules/cudaarithm/CMakeFiles/opencv_cudaarithm.dir/build.make:11685: recipe for target 'lib/libopencv_cudaarithm.so.3.2.0' failed 
make[2]: *** [lib/libopencv_cudaarithm.so.3.2.0] Error 1 
CMakeFiles/Makefile2:1204: recipe for target 'modules/cudaarithm/CMakeFiles/opencv_cudaarithm.dir/all' failed 
make[1]: *** [modules/cudaarithm/CMakeFiles/opencv_cudaarithm.dir/all] Error 2 
Makefile:160: recipe for target 'all' failed 
make: *** [all] Error 2 
+0

Dlaczego chcesz zbudować cudalegację, od jakiegoś czasu było kłopotliwe – Sarvex

+0

Niestety, anulowanie wyboru cudalegacy nie rozwiązuje problemu. Istnieje jeszcze wiele błędów związanych z definicją łącza. – AMCoded

+0

Spróbuj skompilować najpierw bez wsparcia CUDA, aby zawęzić debugowanie. – Sarvex

Odpowiedz

1

mam studyjne wiele obejścia i wreszcie wymyśliłem rozwiązanie do budowania OpenCV 3.2 z CUDA 8 w Debianie 9. Istnieje wiele why bez odpowiedzi z tego rozwiązania, ale to rzeczywiście działa:

1-trzeba gcc wersje kompilacji 5.1 do 5.x.

2 należy zainstalować równoważne wersje kompilator g ++ (nie trzeba odinstalować swoje nowsze wersje kompilatora)

3-Sam OpenCV powinny być zestawiane z gcc 5.x więc należy skorzystać gcc i g ++ kompilator ręcznie w cUpewnij

4-oddzielna opcja kompilacja powinna być wyłączona z cUpewnij dzięki @InfinityChaos dla tej oferty

opcja

5-pre-kompilator powinien być wyłączenie z cUpewnij (bardzo ważne)

6-można włączyć opcje Qt, OpenGL i OpenCl nie wystąpią problemy

7-nie trzeba zaznaczać opcji TBB.

+0

TBB nie powoduje żadnych błędów, może być używany. Po prostu nie używaj 'BUILD_TBB', pobierz gotowy pakiet TBB z Internetu i ustaw go tam. – FadedCoder

1

Dobra, znalazłem obejście wreszcie. (Btw, używam CMake GUI).

Musisz odznaczyć CUDA_SEPARABLE_COMPILATION w opcjach CMake-GUI.

Niestety, to obejście i kompilacja rozdzielana CUDA nie może być używana w systemie Linux. (Do tego celu musisz użyć Windowsa). Znalazłem to w numerze (https://github.com/opencv/opencv/issues/5557) w repozytorium OpenCV.

PS:

Mam problemy budowania OpenCV z Qt5. Jeśli Ci się to uda, powiadom mnie w komentarzach. Dzięki!

+0

Cześć, dziękuję za udostępnienie rozwiązania. Jeszcze tego nie próbowałem. Ale bez CUDA mogłem skompilować z qt5.Nie mogę zrozumieć, dlaczego z oddzielną kompilacją powinno się nie powieść, czy chcesz opublikować link do oryginalnego problemu? Czy uważasz, że warto spróbować skompilować wszystkie opencv i CUDA z gcc-5 – AMCoded

+0

Próbowałem znaleźć problem, ale nie mogłem go znaleźć ponownie. Tak właśnie zrobiłem - CUDA 8.0 nie kompiluje się z GCC 5+, więc musiałem zainstalować GCC 4.9 (otrzymałem go od starej debianowej Jessie) i ustawiłem kompilator hosta CUDA jako GCC 4.9 i resztę OpenCV z GCC 6 – FadedCoder

+0

Znaleźliśmy problem atlast, faktycznie problem jest nadal otwarty -> https://github.com/opencv/opencv/issues/5557 – FadedCoder