首页 文章

在CMake中链接CUDA库

提问于
浏览
3

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

我的CMake文件如下所示:

ALGO:

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时,我会得到链接错误

../mpleration/libmatrix1_testCuda_core.a(ParallelComputation.cu.o):在Funktion'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

1 回答

  • 4

    我打电话给这个工作

    find_package(CUDA 9.0 REQUIRED)
    

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

    target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
    

    我期待CUDA的语言支持会使这些步骤变得不必要,但显然不是 .

相关问题