c++ CUDA库在CMake中的链接

41zrol4v  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(213)

我正在使用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})

BuildingJustAlgo运行良好,但是当同时构建Test时,我会遇到链接错误,例如
../实现/libmatrix1_testCuda_core.a(并行计算.cu.o):在函数“cudaError cudaMalloc(浮点型**,无符号长整型)”中:文件名:(.text+0x 4f 2):未定义的引用'cudaMalloc'
使用make VERBOSE=1编辑我得到了这个链接命令:
/usr/bin/c++ -壁厚,--非按需-pthread -g -标准品=c++14 -壁厚
CMakeFiles/矩阵1_testCuda_gtest.dir//测试/eclipse项目/算法/testCuda/测试/源代码/主.cpp.o CMakeFiles/矩阵1_testCuda_gtest.dir/cmake设备链接.o -o矩阵1_testCuda_gtest.../实现/libmatrix1_testCuda_core.a/usr/lib/libgtest. a/usr/lib/libgtest_主. a

xwbd5t1u

xwbd5t1u1#

我是打电话来让它工作的

find_package(CUDA 9.0 REQUIRED)

此外,在Algo文件(包含设备代码)中,我必须执行以下操作

target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})

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

piwo6bdm

piwo6bdm2#

我刚刚遇到了与此非常相似的情况,根本问题是我的大部分二进制文件是用我的system cxx编译器编译的,而cuda位是用cuda gcc编译器编译的(system编译器为9.1,cuda编译器为8.3)。
令人惊讶的是,通过更改以下内容进行了修复:
第一个月

project(MyProject LANGUAGES CUDA CXX)
修改之后,CMake选择了cuda版本的gcc编译器作为主编译器,我的二进制文件又开始编译了。我不确定这是否会给其他包带来问题,但它修复了我遇到的链接问题。

gv8xihay

gv8xihay3#

在CMake 3.18中添加了可能的方式,并进一步
如果您不希望包含任何CUDA代码,但仅使用来自C++的cufft调用,则执行以下操作即可

find_package(CUDAToolkit)
target_link_libraries(project CUDA::cudart)
target_link_libraries(project CUDA::cufft)

如果您正在启用CUDA支持,除非您想遇到麻烦,否则请在启用CUDA后调用它。

include(CheckLanguage)
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
enable_language(CUDA)
find_package(CUDAToolkit)
target_link_libraries(project CUDA::cudart)
target_link_libraries(project CUDA::cuda_driver)
else()
message(STATUS "No CUDA compiler found")
endif()

因为CUDAToolkit respects启用了添加的CUDA运行时,但它不工作,反之亦然。

相关问题