CMake does not properly find CUDA library

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

I'm trying to build a program that requires CUDA. To the CMake script I supply:

cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda .. 

CUDA is found and CMake runs normally:

staudt ~/workspace/clutbb/cluster/build $ cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda ..                                                                                   -- Found CUDA: /usr/local/cuda (found version "6.5")  -- Found Intel TBB -- Boost version: 1.56.0 -- Found the following Boost libraries: --   iostreams --   program_options -- Looking for include file pthread.h -- Looking for include file pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE   -- Could NOT find SDL (missing:  SDL_LIBRARY SDL_INCLUDE_DIR)  -- Configuring done -- Generating done -- Build files have been written to: /home/i11/staudt/workspace/clutbb/cluster/build 

But then the linker step fails:

staudt ~/workspace/clutbb/cluster/build $ make [ 69%] Built target cluster Linking CXX executable clu CMakeFiles/clu.dir/clu.cpp.o: In function `initCUDA(int&, CUctx_st*&, int const&)': clu.cpp:(.text+0x517): undefined reference to `cuInit' clu.cpp:(.text+0x52b): undefined reference to `cuDeviceGet' clu.cpp:(.text+0x53f): undefined reference to `cuCtxCreate_v2' clu.cpp:(.text+0x559): undefined reference to `cuDeviceGetName' clu.cpp:(.text+0x55e): undefined reference to `cuCtxSynchronize' CMakeFiles/clu.dir/clu.cpp.o: In function `exitCUDA(int&, CUctx_st*&)': clu.cpp:(.text+0x684): undefined reference to `cuCtxDestroy_v2' CMakeFiles/clu.dir/clu.cpp.o: In function `main': clu.cpp:(.text.startup+0x1092): undefined reference to `cuCtxDestroy_v2' clu.cpp:(.text.startup+0x10d1): undefined reference to `cuCtxSynchronize' clu.cpp:(.text.startup+0x10e1): undefined reference to `cuCtxSynchronize' collect2: error: ld returned 1 exit status make[2]: *** [bin/clu] Fehler 1 make[1]: *** [bin/CMakeFiles/clu.dir/all] Fehler 2 make: *** [all] Fehler 2 

The required library is at /usr/local/cuda/lib64/stubs/libcuda.so, but how can I point that out to cmake or make?

回答1:

In the archive you have now posted, there are multiple project hierarchies. The actual error you have posted in the question is occurring during compile and linking of the clu project based on clu.cpp in the clutbb/cluster/bin directory.

In this same directory, there is a CMakeLists.txt file. This file governs this particular level of the project hierarchy.

In this particular CMakeLists.txt file, there is the following section:

cuda_add_executable(clu clu.cpp) target_link_libraries(clu ${CUDA_LIBRARY} ${TBB_LIBRARY} ${Boost_LIBRARIES} rt) target_link_libraries(clu cluster) 

Try modifying the middle line above to:

target_link_libraries(clu ${CUDA_LIBRARY} ${TBB_LIBRARY} ${Boost_LIBRARIES} rt cuda) 

This should fix the missing -lcuda in the linker command line. It may still be necessary to give it the path to libcuda.so on your machine, but it may not be necessary, depending on how your machine environment is set up.



回答2:

The C++ file with host calls doesnt know it needs to link to libcudart. You have to explicitly set dependencies for the file/binary that file is in, eg.

target_link_libraries(clu ${CUDA_LIBRARIES}) 

The above response is slightly wrong. It looks like libcuda.so is installed in unexpected location for whatever reason. You can try setting CMAKE_LIBRARY_PATH or/and CUDA_LIB_PATH to that path.

The CUDA_LIB_PATH needs to be set outside cmake I think, eg export CUDA_LIB_PATH=/usr/local/cuda/lib64/stubs/



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!