Ошибка nvlink при связывании кода CUDA со статической библиотекой CUDA - CMake
Я создаю статическую библиотеку, которая содержит некоторый код 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 с библиотекой, которая содержит код CUDA?
- Если да, то как бы я сделал это с помощью CMake?
В документации по CUDA говорится ( http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html)
"Можно выполнить несколько ссылок на устройства в пределах одного исполняемого файла хоста, если каждая ссылка на устройство независима от другой (они не могут совместно использовать код между исполняемыми файлами устройства)"
Звучит так, будто я не могу делать то, что хочу, верно?
Я использую CUDA 5.5 и GCC 4.8.