对`cuMemAlloc_v2'的未定义引用

问题描述 投票:0回答:1

我需要修改linux rdma-core驱动并添加一些cuda相关的功能;首先,

cuMemAlloc
。 我已更改驱动程序中的 CMake 文件以包含
cuda.h
头文件。但是当我编译驱动程序时,我收到
undefined 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 compiler-errors cuda undefined-reference
1个回答
0
投票

扩展@talonmies的有效评论/答案

第一部分:底层错误及解决方案

当您收到以下形式的错误时:

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

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

func2
的函数的编译代码。

这可能意味着多种情况之一,但也许最可能的原因是链接器尚未定向到相关库所在的位置。它具有 you 已编译的文件,但即使您为每个库提供带有

-lfoo
的相关库名称 - 它仍然需要知道在哪里查找文件
libfoo.a
(或
libfoo.so
等)。可以告诉链接器使用
-L/path/to/library/files/
命令行参数,或通过
LIBRARY_PATH
环境变量。

在您的例子中,

cuMemAlloc()
是一个CUDA驱动程序API函数。因此,您需要提及 CUDA 驱动程序库访问库所在的目录。通常,驱动程序库位于
/usr/lib/x86_64-linux-gnu/libcuda.so
(当然取决于您的平台),因此您的链接器命令行需要一个
-L/usr/lib/x86_64-linux-gnu
参数。

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

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

(待续...)

© www.soinside.com 2019 - 2024. All rights reserved.