未定义对“cuMemAlloc_v2”的引用

undefined reference to `cuMemAlloc_v2'

提问人:Nurlan Nazaraliyev 提问时间:8/27/2023 最后编辑:TsyvarevNurlan Nazaraliyev 更新时间:8/28/2023 访问量:114

问:

我需要修改linux rdma-core驱动,添加一些cuda相关的功能;首先。 我更改了驱动程序中的 CMake 文件以包含头文件。但是当我编译驱动程序时,出现错误cuMemAlloccuda.hundefined reference to

在 CMakeLists.txt 文件中,我包括

project(rdma-core LANGUAGES CUDA C CXX)
FIND_PACKAGE(CUDA 12.2 REQUIRED)

-I/usr/local/cuda-12.2/include -lcuda

RDMA_AddOptCFlag(CMAKE_C_FLAGS HAVE_C_WARNINGS
  "-Wall -Wextra -Wno-sign-compare -Wno-unused-parameter -I/usr/local/cuda-12.2/include -lcuda")

虽然成功找到了 cuda.h,但我收到以下编译错误:

/usr/bin/ld: CMakeFiles/mlx5.dir/verbs.c.o: in function `mlx5_alloc_dyn_uar':
/home/nurlan/rdma-core/providers/mlx5/verbs.c:235: undefined reference to `cuMemAlloc_v2'
/usr/bin/ld: /home/nurlan/rdma-core/providers/mlx5/verbs.c:235: undefined reference to `cuMemAlloc_v2'
/usr/bin/ld: CMakeFiles/mlx5.dir/verbs.c.o: in function `mlx5_alloc_pd':
/home/nurlan/rdma-core/providers/mlx5/verbs.c:153: undefined reference to `cuMemAlloc_v2'
collect2: error: ld returned 1 exit status
make[2]: *** [providers/mlx5/CMakeFiles/mlx5.dir/build.make:501: lib/libmlx5.so.1.24.48.0] Error 1
make[1]: *** [CMakeFiles/Makefile2:1560: providers/mlx5/CMakeFiles/mlx5.dir/all] Error 2
make: *** [Makefile:136: all] Error 2

有人遇到过类似的问题或知道这个问题的解决方案吗?

cmake 编译器错误 cuda 未定义引用

评论

2赞 talonmies 8/27/2023
需要将 CUDA 驱动程序 API 存根库添加到链接器搜索路径

答:

1赞 einpoklum 8/28/2023 #1

扩展@talonmies有效评论/答案

第一部分:较低级别的错误和解决方案

当您收到表单错误时:

/usr/bin/ld: somefile.o: in function `func1`... undefined reference to `func2`

这是一个链接器错误。这意味着源文件的编译已成功(特别是找到了相关的头文件);但是,将生成的对象文件链接到可执行文件失败,因为没有找到名为 的函数的编译代码。func2

这可能意味着以下几种情况之一,但也许最可能的原因是链接器尚未定向到相关库所在的位置。它有你编译的文件,但即使给它每个库的相关库名称 - 它仍然需要知道在哪里查找文件(或等)。可以使用命令行参数或通过 LIBRARY_PATH 环境变量告知链接器。-lfoolibfoo.alibfoo.so-L/path/to/library/files/

在您的例子中,是一个 CUDA 驱动程序 API 函数。因此,您需要提及 CUDA 驱动程序库访问库所在的目录。通常,驱动程序库位于(当然取决于您的平台) - 如果已安装。但是 CUDA 发行版本身有一个存根驱动程序库,位于(假设这是您安装 CUDA 的地方),您也应该能够链接到它。因此,链接器命令行需要一个或类似参数的东西。cuMemAlloc()/usr/lib/x86_64-linux-gnu/libcuda.so/usr/local/cuda-12.2/lib64/stubs/libcuda.so-L/usr/lib/x86_64-linux-gnu-L/usr/local/cuda-12.2/lib64/stubs

第 2 部分:在 CMake 中修复问题

使用 CMake 配置生成时,可以通过更高的抽象级别和更少的细节来实现上述效果。也就是说,您大多避免自己设置特定的命令行参数,而是定义适当的目标依赖项。

首先 - 该包在较新版本的 CMake 中已弃用!请参阅此答案中的说明。所以,而不是:CUDA

find_package(CUDA 12.2 REQUIRED)

我们写道:

find_package(CUDAToolkit 12.2 REQUIRED)

(请参阅此包的文档。然后,我们可以使用为我们提供以下目标:

target_link_libraries(some_rdma_target CUDA::cuda_driver)

target_link_libraries(some_other_rdma_target CUDA::cudart)

(或两者兼而有之,具体取决于哪个目标) 这应该处理编译的所有命令行参数和链接的命令行参数。您不必自己将其中任何一项添加到 or 或 .-I-l-LCMAKE_C_FLAGSCMAKE_CXX_FLAGS

评论

0赞 Nurlan Nazaraliyev 8/28/2023
没有帮助我。具体来说,我添加了 -L/usr/lib/x86_64-linux-gnu/stubs,但仍然出现相同的错误。我想 libcuda.so 无法链接。
0赞 einpoklum 8/28/2023
@NurlanNazaraliyev: 1.尝试非存根。2. 尝试以“CMake 方式”进行操作。
0赞 Nurlan Nazaraliyev 8/29/2023
我尝试了非存根。但仍然对我不起作用。