将CUDA代码与CUDA静态库链接时的nvlink错误 - CMake

时间:2014-03-20 17:30:34

标签: 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)

这将产生libsomestatic.a

现在我想将这个静态库与可执行文件链接起来,后者本身包含CUDA代码和C ++代码。

在此可执行文件的CUDA代码中,我需要实例化并使用CudaClass1中的libsomestatic.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)

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

nvlink error: Undefined reference to '_ZN10test7CudaClass1C1EPKNS_11intE' in ...

我有两个问题:

  1. 是否有可能实现这一目标?将CUDA代码链接到包含CUDA代码的库?
  2. 如果是,我将如何使用CMake执行此操作?
  3. CUDA文档说明(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples

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

    听起来我不能做我想做的事,对吧?

    我使用CUDA 5.5和GCC 4.8。

0 个答案:

没有答案