我创建了一个静态库,其中包含一些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 ...
我有两个问题:
CUDA文档说明(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples)
“可以在单个主机可执行文件中执行多个设备链接,只要每个设备链接独立于另一个(它们不能跨设备可执行文件共享代码)”
听起来我不能做我想做的事,对吧?
我使用CUDA 5.5和GCC 4.8。