【问题标题】:Linking of CUDA library in CMake在 CMake 中链接 CUDA 库
【发布时间】:2018-07-09 16:22:02
【问题描述】:

我正在使用 CMake 3.10,并且在将已编译库链接到 CMake 中的测试可执行文件时遇到问题。 我搜索了很多,发现在早期版本中存在无法链接结果可执行文件中的中间库的问题。我无法判断这是否已解决或仍然是一个问题。

我的 CMake 文件如下所示:

算法:

cmake_minimum_required (VERSION 3.9)
project(${MODULE_NAME}_core LANGUAGES CXX CUDA)


add_subdirectory("${core_impl_dir}" implementation)


set(cuda_src "parallel/ParallelComputation.cu")
set(cuda_hdr "parallel/ParallelComputation.h")

add_library(${PROJECT_NAME} STATIC "${cuda_src}" "${cuda_hdr}"
)


target_include_directories (${PROJECT_NAME} PUBLIC "include/" 
"parallel/"
)

source_group("parallel"  FILES "${cuda_src}" "${cuda_hdr}")


set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${MODULE_NAME})

测试:

project(${MODULE_NAME}_gtest LANGUAGES CXX CUDA)

add_subdirectory("${gtest_impl_dir}" implementation)

add_executable(${PROJECT_NAME} "${gtest_impl_src}")
target_link_libraries(${PROJECT_NAME} ${MODULE_NAME}_core)

enable_testing()
find_package(GTest REQUIRED)
include_directories("${GTEST_INCLUDE_DIRS}")


target_link_libraries(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES})

source_group("Implementation\\Source Files" FILES "${gtest_impl_src}" )

set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${MODULE_NAME})

add_test(${PROJECT_NAME} ${PROJECT_NAME})

仅构建 Algo 可以正常工作,但在构建 Test 时,例如出现链接错误

../implementation/libmatrix1_testCuda_core.a(ParallelComputation.cu.o): 在函数'cudaError cudaMalloc(float**, unsigned long)'中: tmpxft_00005ad0_00000000-5_ParallelComputation.cudafe1.cpp:(.text+0x4f2): 未定义引用'cudaMalloc'

编辑 使用make VERBOSE=1 我得到了这个链接命令:

/usr/bin/c++ -Wl,--no-as-needed -pthread -g -std=c++14 -Wall
CMakeFiles/matrix1_testCuda_gtest.dir//tests/eclipseProject/algos/testCuda/test/src/main.cpp.o CMakeFiles/matrix1_testCuda_gtest.dir/cmake_device_link.o -o matrix1_testCuda_gtest ../implementation/libmatrix1_testCuda_core.a /usr/lib/libgtest.a /usr/lib/libgtest_main.a

【问题讨论】:

  • 根本原因可能是没有链接 CUDA 运行时库。如果 nvcc 正在执行链接,则没有必要,这表明您的主机编译器正在执行链接。你如何在 CMake 中修复它,我不知道
  • @talonmies 我通过使用 find_package(CUDA 9.0 REQUIRED) 或将链接器语言显式设置为 CUDA 来解决 CUDA 运行时问题。现在链接器抱怨设备代码。我在这里不明白的是,设备代码只在库中被调用,主要测试代码只导入一个接口,该接口暴露了正常的 C++ 方法,而这些方法又调用了设备代码。为什么这里还需要链接,设备代码的链接不应该在建库的那一步就已经完成了吗?
  • @talonmies 别介意最后一个其实是我的错误,header 中的命名空间和实现不匹配,编译器没有捕捉到。

标签: c++ cmake cuda linker-errors


【解决方案1】:

我通过调用

得到了这个工作
find_package(CUDA 9.0 REQUIRED)

在两个 CMake 文件中。 此外,在 Algo 文件(包含设备代码)中,我必须这样做

target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})

我原以为对 CUDA 的语言支持会使这些步骤变得不必要,但显然不是。

【讨论】:

  • 在较新的 CMake 版本中,这不再是惯用的解决方案。
  • @einpoklum 由于这似乎是很多人都看过的问题,如果对于较新的 CMake 版本这有不同,请使用新方法添加答案。
【解决方案2】:

我刚刚遇到了与此非常相似的问题,根本问题是我的大多数二进制文件是用我的系统 cxx 编译器编译的,而 cuda 位是用 cuda gcc 编译器编译的(系统为 9.1,系统为 8.3 cuda)。

令人惊讶的是,它通过更改得到了修复:

project(MyProject LANGUAGES CXX CUDA)

project(MyProject LANGUAGES CUDA CXX)

更改后,CMake 选择了 gcc 编译器的 cuda 版本作为主编译器,我的二进制文件再次开始构建。我不确定这是否会给其他软件包带来问题,但它解决了我遇到的链接问题。

【讨论】:

  • 我有一个工作项目,然后它无法使用 CUDA 编译。类似的错误。相同的解决方案。
  • 就个人而言,我有一个问题,除非我明确指定它,否则它不会链接 CUDA 库...
猜你喜欢
  • 2019-06-18
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多