提问人:Nurlan Nazaraliyev 提问时间:8/27/2023 最后编辑:TsyvarevNurlan Nazaraliyev 更新时间:8/28/2023 访问量:114
未定义对“cuMemAlloc_v2”的引用
undefined reference to `cuMemAlloc_v2'
问:
我需要修改linux rdma-core驱动,添加一些cuda相关的功能;首先。
我更改了驱动程序中的 CMake 文件以包含头文件。但是当我编译驱动程序时,出现错误cuMemAlloc
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
这可能意味着以下几种情况之一,但也许最可能的原因是链接器尚未定向到相关库所在的位置。它有你编译的文件,但即使你给它每个库的相关库名称 - 它仍然需要知道在哪里查找文件(或等)。可以使用命令行参数或通过 LIBRARY_PATH
环境变量告知链接器。-lfoo
libfoo.a
libfoo.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
-L
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
评论