编译rdma-core驱动时遇cuMemAlloc_v2未定义引用错误求解决
解决rdma-core编译时CUDA函数未定义引用错误
错误原因
你把链接库参数-lcuda放到了CMAKE_C_FLAGS中,这是错误的——CMAKE_C_FLAGS仅用于编译阶段的参数配置,链接库的参数需要传递给链接器,编译阶段gcc不会处理-lcuda,导致链接时找不到cuMemAlloc_v2等CUDA驱动API的符号。
解决方案
步骤1:修正CMake编译参数配置
从RDMA_AddOptCFlag的参数中移除-lcuda,同时推荐使用CUDA包提供的变量自动引入头文件,替代手动的-I路径:
# 主CMakeLists.txt中修改 project(rdma-core LANGUAGES CUDA C CXX) FIND_PACKAGE(CUDA 12.2 REQUIRED) # 替换手动的-I,用CUDA包提供的头文件目录 include_directories(${CUDA_INCLUDE_DIRS}) # 修正CFLAGS,移除-lcuda RDMA_AddOptCFlag(CMAKE_C_FLAGS HAVE_C_WARNINGS "-Wall -Wextra -Wno-sign-compare -Wno-unused-parameter")
步骤2:为mlx5目标添加CUDA链接库
找到providers/mlx5/CMakeLists.txt中定义mlx5库的部分(通常是add_library(mlx5 ...)),添加链接CUDA驱动库的配置:
# 在providers/mlx5/CMakeLists.txt中添加 target_link_libraries(mlx5 PRIVATE ${CUDA_CUDA_LIBRARY})
(可选)使用新版CMake的CUDAToolkit模块(推荐)
如果你的CMake版本≥3.10,更推荐使用CUDAToolkit模块替代旧的CUDA包,配置更简洁:
# 主CMakeLists.txt project(rdma-core LANGUAGES CUDA C CXX) find_package(CUDAToolkit 12.2 REQUIRED) # providers/mlx5/CMakeLists.txt target_link_libraries(mlx5 PRIVATE CUDA::cuda_driver)
验证
重新执行cmake生成构建文件,再执行make编译,链接错误应该会消失。
内容的提问来源于stack exchange,提问作者Nurlan Nazaraliyev
相关产品推荐
相关产品推荐

