2017-02-25 13 views
6

Tôi muốn xây dựng opencv 3.2 với cuda 8 và tôi đã cài đặt tất cả các thư viện cần thiết cho cuda trong hệ thống linux của mình là Debian 9 testing (stretch) 4.9.0-1-amd64 sau khi tạo các makefiles với cmake thành công. lỗi liên kết nhiều định nghĩa bằng cách thực hiện lệnh make. Tôi đã thử nhiều cấu hình với cmake và tôi cũng đã kiểm tra gần như tất cả các vấn đề liên quan trong nhiều diễn đàn nhưng tôi không thể tìm thấy giải pháp nào. Trong cmake, tôi đã thay đổi biên dịch CUDA để gcc-5 từ CUDA 8 cần trình biên dịch gcc chậm nhất là phiên bản 5 và trình biên dịch gcc mặc định là phiên bản 6.3 Đây là sản lượng cấu hình cmake tôi:Biên dịch mã nguồn Opencv với cuda tạo ra lỗi liên kết đa định nghĩa

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 

và đây là lệnh make sản lượng

[ 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

Tại sao bạn muốn xây dựng tính cudalegacy, nó đã được phiền hà một thời gian – Sarvex

+0

tiếc là bỏ chọn cudalegacy không giải quyết được vấn đề. Có nhiều lỗi liên kết định nghĩa. – AMCoded

+0

Thử biên dịch mà không cần sự hỗ trợ của CUDA trước để thu hẹp việc gỡ lỗi – Sarvex

Trả lời

1

Tôi có nghiên cứu nhiều cách giải quyết và cuối cùng tôi đã đưa ra một giải pháp để xây dựng OpenCV 3.2 với CUDA 8 trong Debian 9. Có rất nhiều nguyên nhân tại sao chưa được trả lời với giải pháp này nhưng nó thực sự hoạt động:

1-bạn cần gcc phiên bản trình biên dịch 5.1 đến 5.x.

2 bạn nên cài đặt các phiên bản trình biên dịch tương đương cho g ++ (bạn không cần phải gỡ bỏ cài đặt các phiên bản trình biên dịch mới của bạn)

3-Các OpenCV bản thân nên được biên dịch với gcc 5.x vì vậy bạn nên chọn của bạn gcc và g ++ biên dịch bằng tay trong cmake

4-tùy chọn biên dịch riêng biệt nên bị vô hiệu hóa từ cmake nhờ @InfinityChaos trình khuyến mãi này

5-The pre-biên dịch tùy chọn nên vô hiệu hóa từ cmake (rất quan trọng)

6-bạn có thể bật tùy chọn Qt, OpenGL và OpenCl không có vấn đề gì sẽ xảy ra

7-bạn không cần đánh dấu tùy chọn TBB.

+0

TBB không gây ra bất kỳ lỗi nào, nó có thể được sử dụng. Chỉ cần không sử dụng 'BUILD_TBB', nhận gói TBB được tạo sẵn từ internet và đặt nó ở đó. – FadedCoder

1

Được rồi, tìm thấy một workaround cuối cùng. (Btw, tôi đang sử dụng CMake GUI).

Bạn phải bỏ chọn CUDA_SEPARABLE_COMPILATION trong tùy chọn CMake-GUI.

Thật không may, đây chỉ là giải pháp khắc phục sự cố và CUDA không thể được sử dụng trong Linux. (Bạn phải sử dụng Windows cho việc này). Tôi tìm thấy điều này trong một vấn đề (https://github.com/opencv/opencv/issues/5557) trong kho lưu trữ OpenCV.

PS:

Tôi gặp rắc rối xây dựng OpenCV với Qt5. Nếu bạn thành công khi làm như vậy, hãy thông báo cho tôi trong phần bình luận. Cảm ơn!

+0

Xin chào, cảm ơn bạn đã chia sẻ giải pháp. Tôi chưa thử. Nhưng không có CUDA tôi có thể biên dịch với qt5.Tôi không thể hiểu tại sao với trình biên dịch riêng biệt nó nên thất bại, bạn vui lòng gửi liên kết vấn đề ban đầu? Bạn có nghĩ rằng nó là giá trị cố gắng để biên dịch tất cả các opencv và CUDA với gcc-5 – AMCoded

+0

Tôi đã cố gắng để tìm ra vấn đề nhưng không thể tìm thấy nó một lần nữa. Đây là những gì tôi đã làm - CUDA 8,0 không biên dịch với GCC 5+, vì vậy tôi đã phải cài đặt GCC 4.9 (tôi đã nhận nó từ debian Jessie cũ), và tôi thiết lập trình biên dịch máy chủ CUDA như GCC 4.9 và phần còn lại của OpenCV với GCC 6 – FadedCoder

+0

Tìm thấy vấn đề tồn tại lâu hơn, thực tế vấn đề vẫn còn mở -> https://github.com/opencv/opencv/issues/5557 – FadedCoder

Các vấn đề liên quan