c++ - 在 Cmake 中使用 Cuda 对象链接

标签 c++ cuda cmake

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

我最终创建了该项目的玩具版本,它出现了与原始项目相同类型的错误。玩具项目包含一个调用内核函数以在 GPU 上运行的主文件 (TextureMain.cu)。在每个 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。

最佳答案

如何使用 `.cu 文件将${CUDA_LIBRARIES} 链接到任何目标?

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

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

关于c++ - 在 Cmake 中使用 Cuda 对象链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15574040/

相关文章:

c++ - visual studio lnk2019 和 1120 错误

c++ - 为什么这个类的成员变量在调用CUDA核函数时没有变化?

c++ - 无法使用 CUDA + MATLAB + Visual Studio 检查全局内存

python - 找不到-lpython2 : MatCaffe installation error

c++ - CMake 找不到源文件(add_executable)

c++ - 在模板中使用 -> 以强制以下符号依赖

C++链表删除所有

graphics - Ubuntu 14.04如何在不安装nvidia驱动的情况下安装cuda 6.5

cmake : specify linux kernel module output build directory

c++ - CLion 编译 glut linux