现在我正在开发一个使用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)
Run Code Online (Sandbox Code Playgroud)
在src目录中(包含TextureMain.cu和TextureFunc目录):
cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc)
install(TARGETS TextureMain DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)
在TextureFunc目录中(包含TextureFunc.h和TextureFunc.cu):
cuda_add_library(TextureFunc TextureFunc.cu )
target_link_libraries(TextureFunc)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用上面的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
Run Code Online (Sandbox Code Playgroud)
这显然是一个链接错误,它可能与我使用cmake编译代码的方式有关.我认为nvcc的标志是正确的,因为我能够使用具有相同标志的Makefile编译该项目.但是,我不确定我还能做错什么.我注意到错误消息引用了一些不存在的.cpp文件,但我不知道该怎么做.
任何可以给出的建议将不胜感激.我正在使用cmake版本2.8.8.
如何${CUDA_LIBRARIES}使用` .cu文件链接到任何目标?
例如,在您的src目录中,您可以尝试:
cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc ${CUDA_LIBRARIES})
install(TARGETS TextureMain DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)