Opencv source compiler with cuda generates multiple definition link error

I want to create opencv 3.2 with cuda 8, and I installed all the necessary libraries for cuda on my Linux system, which is Debian 9 testing (stretch) 4.9.0-1-amd64 after successfully creating make files with cmake, I get a multiple error determine the connection by running the make command. I tried many configurations with cmake, and I also checked almost all the related problems in many forums, but I could not find any solution. In cmake, I changed the cuda compiler to gcc-5, since cuda 8 needs the gcc compiler no later than version 5, and the default gcc compiler is version 6.3. Here is my cmake configuration output:

 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 

and here is the output of the make command

 [ 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 
+6
source share
2 answers

I have many workarounds, and finally I came up with a solution for building OpenCV 3.2 with Cuda 8 in Debian 9. There are many unanswered whys with this solution, but it really works:

1 - you need versions of the gcc compiler from 5.1 to 5.x.

2 - you must install equivalent compiler versions for g ++ (you do not need to remove new versions of the compiler)

3. OpenCV itself must be compiled using gcc 5.x, so you must select your gcc and g ++ compiler manually in CMAKE

4 - a separate compilation option should be disconnected from CMAKE thanks to @InfinityChaos for this sentence

5 - the pre-compiler option must be disconnected from CMAKE (very important)

6 - you can enable the Qt, OpenGL and OpenCl options, no problems

7 - you do not need to check the TBB option.

+1
source

Ok, found a workaround at last. (By the way, I'm using the CMake GUI).

You need to uncheck the CUDA_SEPARABLE_COMPILATION flag in the CMake-GUI options.

Unfortunately, this is just a workaround and CUDA separation compilation cannot be used on Linux. (You must use Windows for this). I found this in the problem ( https://github.com/opencv/opencv/issues/5557 ) in the OpenCV repository.

PS:

I am having trouble creating OpenCV with Qt5. If you succeed, let me know in the comments. Thanks!

+1
source

Source: https://habr.com/ru/post/1015261/


All Articles