Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake: CUDA libraries not found when compiling OpenCV

Tags:

c++

opencv

cmake

I am compiling OpenCV 3.0.0 with CUDA support on Windows, using CMAKE. When I click "configure", errors occur as following:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_cufft_LIBRARY (ADVANCED)
    linked by target "opencv_hal" in directory E:/dev-lib/opencv3/sources/modules/hal
    ...
CUDA_nppc_LIBRARY (ADVANCED)
    ...
CUDA_nppi_LIBRARY (ADVANCED)
    ...
CUDA_npps_LIBRARY (ADVANCED)

I have checked "WITH_CUDA" and "WITH_CUFFT" in entries. If I check "WITH_CUBLAS" as well, the outputs above will add one more CUDA_cublas_LIBRARY error.

But before all these error messages it shows that

CUDA detected: 7.5
CUDA NVCC target flags: -gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_20,code=sm_21;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_30,code=compute_30

which indicates CUDA can be detected by CMAKE. However, those 4 libraries needed cannot be found.

I have installed CUDA 7.5 and compiled it with Visual Studio 2012 before. The CUDA samples run perfectly. So my CUDA libraries should be installed properly.

I wonder even if I have to set these values manually, how should I do it?

My specs: Windows 7 x64, Visual Studio 2012, CMAKE 3.4.0, CUDA Toolkit 7.5

like image 591
John Hany Avatar asked Oct 13 '15 08:10

John Hany


1 Answers

Thanks to tips from Drop in the comments, I solved this problem. In order to close this question, I'm answering my own question.

It's a "Win32 or x64" architecture problem. Since NVIDIA only provides cufft, nvblas, nppc, nppi, npps libs for x64, it's naturally impossible for CMAKE to find these libs for configuring a Win32 OpenCV library.

My solution was to choose Visual Studio 11 Win64 instead of Visual Studio 11 as generator in CMAKE. So that CMAKE will automatically load libs from <CUDA_DIR>\lib\x64 rather than <CUDA_DIR>\lib\Win32. Further more, I also need to load all the other libs required by OpenCV in 64 bit version, such as OpenGL. I will also need to compile OpenCV in x64 architecture. All the code I'm going to write in the future will have to build and debug in x64 only.


Should one have no trouble reading Chinese materials, I'm happy to provide a link towards a post regarding the complete guide on building OpenCV 3.0 on VS2012 with CUDA supports.

like image 101
John Hany Avatar answered Oct 24 '22 09:10

John Hany