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

标签 c++ cmake cuda clion

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

    • CMakeLists.txt
    • 模块
      • 工具
        • CMakeLists.txt
        • 来源
          • util_file.cpp
      • 库达
        • CMakeLists.txt
        • 来源
          • cuda_file.cu

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

我发现了两种解决方法,但它们使用起来不友好或“干净”:

  • 将一个空的 .cpp 文件添加到目录并将其添加到 add_library() CMake 行。
  • 切换到另一个包含 .cpp 文件的库或可执行目标(如我的虚拟示例中的 utils)。但是当你想编译或执行时,你必须再次切换到 cuda 目标(或一些子目标,如用于测试单元的 test_cuda),然后再次切换回来继续编码或调试等......

这是来自 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)

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

我已经在 CLion 选项中将 .cu 和 .cuh 文件添加为 C/C++ 代码,并尝试使用 JETBRAINS_IDE define 选项,如另一篇类似帖子中所述,但这两个问题并不相同 .

最佳答案

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

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

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

这是 nvidia 博客的链接,其中包含有关 CMake 中的官方 cuda 语言支持和新的“cuda 感知”add_library() 的示例:https://devblogs.nvidia.com/parallelforall/building-cuda-applications-cmake/

关于c++ - 代码解析不适用于 CUDA、Clion 和 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462411/

相关文章:

c++ - 在 visual studio 项目中为 opencv 设置包含文件依赖项

c++ - 可变参数模板模板和完美转发

c++ - 根据模板枚举参数更改行为

c++ - 对 glfwSetErrorCallback 的 undefined reference

c - 使用 CMake 设置平台特定/编译器特定的目标属性

cuda - NVIDIA Tesla 和 CUDA 究竟是什么?

c++ - 从 C++ 图像帧到 html5 <客户端浏览器中的视频标签

double 作为模板参数的 C++ 解决方法

cmake - 在 CMake 中安装编译期间生成的自定义文件

memory - CUDA 纹理内存空间