使用Cmake与Cuda对象链接

6

我现在正在开发一个使用Cuda 5的对象链接功能的项目。由于该项目开始变得复杂,我想切换到使用cmake编译代码。但是,我似乎无法让对象链接正确地工作。

最终,我创建了一个玩具版本的项目,它遇到了与原始项目相同类型的错误。玩具项目包括一个主文件(TextureMain.cu),该文件调用内核函数在GPU上运行。在每个GPU线程中,都引用了用户定义类(TextureFunc)的一个实例,其中该类存在于与主文件不同的文件夹中。该类由该文件夹中的TextureFunc.cu和TextureFunc.h文件组成。

这是我使用的CMakeList.txt文件:

在项目目录中(包含src目录):

project(TextureMain)
cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)
#-------------------------------------------------------------------------------
set(CUDA_NVCC_FLAGS "-arch=compute_20; -code=sm_20; -rdc=true; -lcudadevrt")
include_directories(src/TextureFunc)
#-------------------------------------------------------------------------------
add_subdirectory(src/TextureFunc)
add_subdirectory(src)

在src目录下(包含TextureMain.cu和TextureFunc目录):
cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc)
install(TARGETS TextureMain DESTINATION bin)

在 TextureFunc 目录中(包含 TextureFunc.h 和 TextureFunc.cu 文件):
cuda_add_library(TextureFunc TextureFunc.cu )
target_link_libraries(TextureFunc)

当我尝试使用上述的CMakeList.txt文件编译这段代码时,出现了以下错误。
Linking CXX executable TextureMain
CMakeFiles/TextureMain.dir/./TextureMain_generated_TextureMain.cu.o: In function `__sti____cudaRegisterAll_46_tmpxft_00004c15_00000000_6_TextureMain_cpp1_ii_texRef':
/tmp/tmpxft_00004c15_00000000-3_TextureMain.cudafe1.stub.c:2: undefined reference to `__cudaRegisterLinkedBinary_46_tmpxft_00004c15_00000000_6_TextureMain_cpp1_ii_texRef'
TextureFunc/libTextureFunc.a(TextureFunc_generated_TextureFunc.cu.o): In function `__sti____cudaRegisterAll_46_tmpxft_00004bd8_00000000_6_TextureFunc_cpp1_ii_421ca072':
/tmp/tmpxft_00004bd8_00000000-3_TextureFunc.cudafe1.stub.c:8: undefined reference to `__cudaRegisterLinkedBinary_46_tmpxft_00004bd8_00000000_6_TextureFunc_cpp1_ii_421ca072'
collect2: ld returned 1 exit status
make[2]: *** [src/TextureMain] Error 1
make[1]: *** [src/CMakeFiles/TextureMain.dir/all] Error 2

这显然是一个链接错误,可能与我使用cmake编译代码的方式有关。我认为nvcc的标志是正确的,因为我能够使用相同的标志使用Makefile编译此项目。然而,我不确定我还能做错了什么。我确实注意到错误消息引用了一些不存在的.cpp文件,但我不知道该怎么处理。
非常感谢提供任何建议。我正在使用cmake版本2.8.8。

我对CUDA不是很了解,但我看到你在CUDA_NVCC_FLAGS中使用了“-lcudadevrt”。这是唯一需要的库吗?我没有看到它被应用于链接器命令行,但这部分可能被省略了。 - metal
@metal 是的,那个标志可以被移除掉。我之前花了一些时间搜索类似的对象链接问题,并且对于一个问题,建议添加该标志。但是这个标志实际上并没有帮助到任何问题。无论如何,我应该将其删除。 - C.G.
看起来很明显,你缺少一个CUDA库(或者版本不对?)。你能手动构建它,查看正确的命令行选项,然后将其与CMake使用的进行比较吗? - metal
1
那个 -l 标志是否会进入你的 CMAKE_EXE_LINKER_FLAGS 变量中?我的意思是,试着看看 CMake 实际上给链接器提供了哪些标志。 - metal
1
你尝试过在target_link_libraries(TextureMain TextureFunc)中添加-lcudadevrt吗? - BenC
显示剩余3条评论
1个回答

5

您可以尝试将${CUDA_LIBRARIES}链接到使用.cu文件的任何目标中。

例如,在您的src目录中,您可以尝试:

cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc ${CUDA_LIBRARIES})
install(TARGETS TextureMain DESTINATION bin)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接