在编译cmake项目中 容易跳坑事项:
本人菜鸟在cmake项目中踩坑无数,环境配置问题数不胜数,菜鸟经常被折磨得体无完肤,究其原因是不懂cmake编译所致,经过多次踩坑。总结到。环境配置需要对cmakerlist以及FindXXX.cmake相对应。
以Darknet为例:
在目前版本,FindCUDNN.cmake 中
find_path(CUDNN_INCLUDE_DIR NAMES cudnn.h cudnn_v8.h cudnn_v7.h
HINTS $ENV{CUDA_PATH} $ENV{CUDA_TOOLKIT_ROOT_DIR} $ENV{CUDA_HOME} $ENV{CUDNN_ROOT_DIR} $ENV{CUDNN_ROOT_DIR} /usr/include
PATH_SUFFIXES cuda/include include)
if(WIN32)
set(CUDNN_DLL_DIR ${CUDNN_INCLUDE_DIR})
list(TRANSFORM CUDNN_DLL_DIR APPEND "/../bin")
find_file(CUDNN_LIBRARY_DLL NAMES cudnn64_${CUDNN_VERSION_MAJOR}.dll PATHS ${CUDNN_DLL_DIR})
endif()
经常会出现配置之后找不到cuda或者cudnn皆是因为 配置的环境变量 不满足cmake搜索条件。究其原因 是因为CUDNN_DLL_DIR的搜索路径并不是dll所在路径 使用message显示:
message(STATUS "CUDNN_DLL_DIR: ${CUDNN_DLL_DIR}" )
cmake显示为
CUDNN_DLL_DIR: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.5/include/../bin
发现搜索路径出现问题 遂将:
set(CUDNN_DLL_DIR ${CUDNN_INCLUDE_DIR})
list(TRANSFORM CUDNN_DLL_DIR APPEND "/../bin")
两行命令更换为
set(CUDNN_DLL_DIR $ENV{CUDNN_ROOT_DIR}/bin)
其中
find_file(CUDNN_LIBRARY_DLL NAMES cudnn64_${CUDNN_VERSION_MAJOR}.dll PATHS ${CUDNN_DLL_DIR})
中CUDNN_VERSION_MAJOR变量名引用错误 ,导致查找无法找到cudnn64_x.dll 将其更改为
_CUDNN_VERSION_MAJOR 即可
其中$ENV{CUDNN_ROOT_DIR}/bin 为dll的所在路径。本人在环境变量中添加的CUDNN_ROOT_DIR变量, 读者可以根据自己的设定进行修改
在通过message显示:
message(STATUS "CUDNN_DLL_DIR: ${CUDNN_DLL_DIR}" )
cmake显示正常:
CUDNN_DLL_DIR: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5/bin