我需要修改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
有人遇到过类似的问题或者知道这个问题的解决方案吗?
扩展@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
参数。
使用 CMake 配置构建时,您可以通过更高的抽象级别和更少的细节实现上述效果。也就是说,您通常会避免自己设置特定的命令行参数,而是定义适当的目标依赖项。
(待续...)