代码解析不适用于 CUDA、Clion 和 CMake

Code parsing not working with CUDA, Clion and CMake

我有一个分为模块的项目,这里是一个虚拟示例:

如果我用 CLion 编辑 cuda_file.cu,CLion 无法解析所有符号(甚至是标准库中的包含)。 所有代码 completion/creation 功能当然都消失了(除其他外)。问题似乎是,每当您创建仅包含 CUDA 文件的库或可执行文件时,Clion 就会变得愚蠢并且不再解析或解析任何内容。

我找到了两个解决方法,但它们不友好或 "clean" 无法使用:

这是来自 cuda 模块的 CMakeLists.txt 解决方法:

cmake_minimum_required(VERSION 3.5)
message(STATUS "Configuring module cuda")

# Build module static library
FILE(GLOB CUDA_SRCS
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
FILE(GLOB CUDA_CU_SRCS
     ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cu)
FILE(GLOB CUDA_CU_HDRS
    ${CMAKE_CURRENT_SOURCE_DIR}/include/*.cuh)

cuda_compile(cuda_objs ${CUDA_CU_SRCS} ${CUDA_CU_HDRS})
add_library(cuda STATIC ${CUDA_SRCS} ${cuda_objs})
# because only .cu files, help cmake detect C++ language
set_target_properties(cuda PROPERTIES LINKER_LANGUAGE CXX)

在解析指向其他 headers 和库的链接时,有没有办法避免 CLion derping?

我已经在 CLion 选项中将 .cu 和 .cuh 文件添加为 C/C++ 代码,并尝试使用 JETBRAINS_IDE 定义选项,如另一个类似 post,但这两个问题不一样

似乎没有 Jetbrains 的干预来添加官方 CUDA 支持,我最多可以通过以下方式实现 CLion + CMake + CUDA 组合:

  • 在 CLion 中添加 .cu 和 .cuh 作为 C++ 文件。这允许 Clion 将 cuda 代码识别为 C++ 代码并正确地为其着色。
  • 将一个空的虚拟 .cpp 文件添加到 cuda 源目录,如果它仅由 .cu 文件填充(我的 "dirty" 问题之一)。我找不到更好的了。这让 Clion 不会完全 derp。如果没有这个 "hack",像识别 cstdio 这样简单的事情就无法工作,而 CLion 基本上是一个增强的记事本。
  • 尽可能使用官方支持 CUDA 作为语言的 CMake 3.8+,并使用新的 "cuda aware" add_library() 而不是定义的旧宏cuda_add_library()。这可以避免将来在弃用时出现问题。
  • 在 cuda 模块的 CMakeLists(或主 CMakeLists,如果只有一个)中,包含 cuda 包含目录的路径,以允许 Clion "see" cuda headers。然后 CLion 可以建议您包含它们,以便 CLion 正确解析 CUDA API 调用,例如 cudaMalloc()cudaFree()。这只是 CLion 需要的,因为 CUDA 编译器不需要它来正确编译(cuda.hcuda_runtime.h, ...).
  • 使用这个 answer 创建一个 "clion helper" header 文件,这样它就不会像 __device__[=35 这样的符号=] 或 __global__.

我认为如果 Jetbrains 开始添加对 CUDA 的支持,它不会不再需要添加这个虚拟文件,但它可能还会解决列出的所有其他问题。

这是 nvidia 博客的 link,其中包含有关 CMake 中官方 cuda 语言支持和新 "cuda aware" add_library()[=35= 的示例] : https://devblogs.nvidia.com/parallelforall/building-cuda-applications-cmake/

CLion 2020.1版本正式支持CUDA项目

https://blog.jetbrains.com/clion/2020/04/clion-2020-1-cuda-clang-embedded/