Ubuntu下CMake+CUDA10.1编译出现-lcudart未找到链接错误
解决CMake链接cudart库失败及CUDA变量为空的问题
从你的错误信息和CMake配置来看,主要有几个核心问题导致链接失败、CUDA相关变量为空,下面逐一给出解决方案:
1. 修正C++/CUDA标准设置的语法错误
你在设置语言标准时写错了变量格式,把CMAKE_CXX_STANDARD 17写成了CMAKE_CXX_STANDARD_17(下划线替代了空格),这会导致标准配置完全失效,甚至干扰CMake对CUDA的检测逻辑。
修正代码:
if (NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) # 注意是空格分隔,不是下划线 set(CMAKE_CXX_STANDARD_REQUIRED True) endif() if (NOT DEFINED CMAKE_CUDA_STANDARD) set(CMAKE_CUDA_STANDARD 17) # 同样修正此处 set(CMAKE_CUDA_STANDARD_REQUIRED True) endif()
2. 手动指定CUDA 10.1的安装根目录
你的CUDA实际安装在/usr/local/cuda-10.1,但CMake默认会优先查找/usr/local/cuda(通常是软链接),而你的环境中这个软链接可能没有正确关联到10.1版本,导致CMake无法识别CUDA版本和库路径。
解决方法:在CMakeLists开头添加根目录指定:
cmake_minimum_required(VERSION 3.15) # 手动指定CUDA 10.1的安装路径 set(CUDA_TOOLKIT_ROOT_DIR "/usr/local/cuda-10.1") project(testcuda CXX CUDA)
3. 显式调用find_package(CUDA)获取正确的库变量
虽然CMake 3.15支持将CUDA作为语言启用,但显式调用find_package(CUDA)可以强制CMake完整检测CUDA的版本、头文件路径和库文件路径,自动填充CUDA_VERSION、CUDA_LIBRARIES等变量,避免手动链接时找不到库的问题。
调整后的链接配置:
# 显式查找CUDA 10.1版本 find_package(CUDA 10.1 REQUIRED) # 使用CMake检测到的官方库变量,而非手动写库名 target_link_libraries(testcuda PRIVATE ${CUDA_CUDART_LIBRARY} ${CUDA_LIBRARIES})
完整修正后的CMakeLists.txt
cmake_minimum_required(VERSION 3.15) # 指定CUDA 10.1安装根目录 set(CUDA_TOOLKIT_ROOT_DIR "/usr/local/cuda-10.1") project(testcuda CXX CUDA) # 修正C++标准设置 if (NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) endif() # 修正CUDA标准设置 if (NOT DEFINED CMAKE_CUDA_STANDARD) set(CMAKE_CUDA_STANDARD 17) set(CMAKE_CUDA_STANDARD_REQUIRED True) endif() set(CMAKE_EXE_LINKER_FLAGS -v) add_executable(testcuda main.cpp) # 关联CUDA头文件和库 find_package(CUDA 10.1 REQUIRED) target_include_directories(testcuda PRIVATE ${CUDA_INCLUDE_DIRS}) target_link_libraries(testcuda PRIVATE ${CUDA_CUDART_LIBRARY} ${CUDA_LIBRARIES}) # 打印调试信息(验证变量是否被正确填充) MESSAGE(STATUS "CUDA Include Directories: ${CUDA_INCLUDE_DIRS}") MESSAGE(STATUS "CUDA Libraries: ${CUDA_LIBRARIES}") MESSAGE(STATUS "CUDA Version: ${CUDA_VERSION}")
额外检查项
- 可以手动添加库搜索路径确保CMake能找到cudart:
link_directories("/usr/local/cuda-10.1/targets/x86_64-linux/lib") - 检查
/usr/local/cuda软链接是否正确:执行ls -l /usr/local/cuda,确认它指向/usr/local/cuda-10.1
内容的提问来源于stack exchange,提问作者user3691191
相关产品推荐
相关产品推荐

