Использование первоклассной языковой поддержки CUDA в cmake (что вы и делаете, когда устанавливаете, что CUDA
- это язык, используемый вашим проектом) означает, что cmake собирается использовать компилятор NVidia для .cu
файлы и некоторый другой компилятор (такой как gcc) на других файлах. Когда вы используете add_executable
, cmake также проверяет наличие .cu
расширений файлов, чтобы выяснить, как правильно связать вместе ваше приложение.
FindCUDA
- это более старый набор инструментов, который не обязательно отменяет это поведение. Вы прошли 90% пути к репликации первоклассных языковых функций с использованием макросов, предоставленных FindCUDA
, но add_executable
не может выполнить некоторые необходимые дополнительные действия, поэтому ваше приложение взрывается. Обычно вы используете макрос CUDA_ADD_EXECUTABLE
для обозначения исполняемого файла CUDA при использовании инструментов FindCUDA
.
Итак, вот что вы должны сделать: если вы не хотите, чтобы ваш основной файл имел .cu
расширение, затем просто переместите вашу функцию foo
в отдельный файл .cu
со своим собственным заголовком, который вы включили в main.cpp
. Вам не нужно будет использовать set_source_files_properties
, поскольку код вашего устройства будет правильно разделен на собственный .cu
, что позволит cmake предпринять правильные шаги.
Посмотрите эту статью для получения дополнительной информации и ссылок. : https://shawnliu.me/post/cuda-as-a-language-in-cmake/