c++ - 在 CMake 中链接 CUDA 库

标签 c++ cmake cuda linker-errors

我正在使用 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 工作正常,但同时构建测试时,我会遇到链接错误

../implementation/libmatrix1_testCuda_core.a(ParallelComputation.cu.o): In Funktion 'cudaError cudaMalloc(float**, unsigned long)': tmpxft_00005ad0_00000000-5_ParallelComputation.cudafe1.cpp:(.text+0x4f2): Undefined reference '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

最佳答案

我打电话让这个工作

find_package(CUDA 9.0 REQUIRED)

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

target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})

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

关于c++ - 在 CMake 中链接 CUDA 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48527238/

相关文章:

c++ - 在 Windows 8 中为 CUDA 禁用 TDR

调试时 CUDA 共享内存不独占阻塞

crash - 大数据集的CUDA崩溃

visual-studio - CMake Visual Studio 'Debug' 文件夹

boost - cmake v3.15.3找不到boost v1.71.0

c++ - 在 CLion 项目中链接 boost

c++ - Printf 疯了

c++ - 编写一个使多个容器看起来像一个的迭代器

android - 如何防止 Gradle/Android Studio 覆盖 CMake 提供的 C++ 编译器设置?

c++ - C++ 对象如何访问其成员函数?