针对CUDA静态库链接CUDA代码时出现nvlink错误-CMake

m.s*_*.s. 5 c++ cuda cmake nvcc nvlink

我创建了一个静态库,其中包含一些CUDA代码和一些常规C ++代码。此静态库的CMakeLists.txt如下所示:

SET(TARGET_H some_header.h)
SET(CUDA_SRC cudaclass1.cu cudaclass2.cu)
SET(TARGET_SRC cppclass1.cpp cppclass2.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_LIBRARY(somestatic ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
Run Code Online (Sandbox Code Playgroud)

这将产生libsomestatic.a

现在,我想将此静态库与可执行文件链接,该可执行文件本身由CUDA代码和C ++代码组成。

在这个可执行文件的CUDA代码,我需要实例化并使用CudaClass1libsomestatic.a

这是CMakeLists.txt可执行文件:

SET(TARGET_H some_header.h)
SET(CUDA_SRC cudafile.cu)
SET(TARGET_SRC main.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_EXECUTABLE(some_exe ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
TARGET_LINK_LIBRARIES(some_exe somestatic)
Run Code Online (Sandbox Code Playgroud)

但是在构建时出现以下错误:

nvlink error: Undefined reference to '_ZN10test7CudaClass1C1EPKNS_11intE' in ...
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 有可能完全做到这一点吗?将CUDA代码链接到包含CUDA代码的库?
  2. 如果是,我将如何使用CMake做到这一点?

CUDA文档说明(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples

“可以在单个主机可执行文件中进行多个设备链接,只要每个设备链接彼此独立(它们不能跨设备可执行文件共享代码)”

听起来我无法做我想做的事,对吧?

我使用CUDA 5.5和GCC 4.8。