Как корректно собрать C++ CUDA проект через Cmake на Linux?

Не удается правильно написать Cmake так, чтобы получилось собрать проект. Вылетает ошибка undefined reference to `main'.
Структура проекта:
main.cpp
include
-- CUDA_wrappers.hpp
src
-- CUDA.cu
cmake_minimum_required(VERSION 3.8)
project(Mandelbrot_set)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp include/CUDA_wrappers.hpp src/CUDA.cu)

# LIBGD Package
find_package(GD REQUIRED)
include_directories(${GD_INCLUDE_DIR})

# CUDA Package
find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})

# Compile CU files
list( APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_20,code=sm_20; -std=c++11")
cuda_compile(CudaKernel src/CUDA.cu)
cuda_add_library(CudaKernels src/CUDA.cu)

# COMPILE AND LINK
cuda_add_executable(Mandelbrot_set $(SOURCE_FILES) CudaKernels)
target_link_libraries(Mandelbrot_set ${GD_LIBRARIES} ${CUDA_LIBRARIES})

В Cmake не разбираюсь, пробовал различные варианты из сети.
CUDA вроде как корректно работает, она видит мой адаптер и корректно отображает его характеристики.
В main.cpp и CUDA.cu инклудится CUDA_wrappers.hpp. В CUDA_wrappers.hpp объявлена функция, которая определена в CUDA.cu. Эта функция вызывается в main.cpp
Если понадобятся еще детали - сообщу.
  • Вопрос задан
  • 1081 просмотр
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
cuda_compile(CudaKernel src/CUDA.cu)
cuda_add_library(CudaKernels src/CUDA.cu)

Подозрительно разные идентификаторы, это точно так надо? Зачем вообще этот cuda_compile? Если вы его используете, тогда вам надо то что он положит в CudaKernel подставить в cuda_add_library, например cuda_add_library(CudaKernels ${CudaKernel})

cuda_add_executable(Mandelbrot_set $(SOURCE_FILES) CudaKernels)

Странная конструкция. Если CudaKernels это таргет, что он делает в этом списке, где должны быть исходники?

И должен ли src/CUDA.cu компилится дважды?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы