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

时间:2017-08-02 13:34:40

标签: c++ cmake cuda clion

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

    • CMakeLists.txt
    • 模块
      • utils的
        • 的CMakeLists.txt
        • SRC
          • util_file.cpp
      • CUDA
        • 的CMakeLists.txt
        • SRC
          • cuda_file.cu

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

我找到了两种解决方法,但它们并不友好,或者#34;清洁"使用:

  • 将空的.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)

在解析到其他标头和库的链接时,有没有办法避免CLion derping?

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

2 个答案:

答案 0 :(得分:2)

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

  • 将.cu和.cuh添加为CLion中的C ++文件。这允许Clion将cuda代码识别为C ++代码并正确地着色。
  • 将一个空的虚拟.cpp文件添加到cuda源目录中,如果它只由.cu文件填充(我的一个"脏"来自我的问题的黑客攻击)。我找不到更好的。这使得Clion不会完全消失。识别 cstdio 之类的简单事情是没有这个" hack"而且CLion基本上是一个增强型记事本。
  • 尽可能使用CMake 3.8+,正式支持CUDA作为一种语言并使用新的" cuda aware" add_library()而不是旧的宏 cuda_add_library()。如果弃用,这可以避免将来出现问题。
  • 在cuda模块的CMakeLists中(或主要的CMakeLists,如果只有一个),包括cuda的include目录的路径,以允许Clion"参见" cuda标题。然后,CLion可以建议您包含它们,以便CLion正确解析CUDA API调用,如 cudaMalloc() cudaFree()。这仅适用于CLion,因为CUDA编译器并不需要这包括正确编译( cuda.h cuda_runtime.h ,...)。 / LI>
  • 使用此answer创建一个" clion帮助器"头文件,因此它不会对 __ device __ __ global __ 等符号进行解除。

我认为如果Jetbrains开始添加对CUDA的支持,那么它也不会删除添加这个虚拟文件的需要,但它也可能会解决列出的所有其他内容。

以下是nvidia博客的链接,其中包含有关CMake中官方cuda语言支持的示例以及新的" cuda aware" add_library()https://devblogs.nvidia.com/parallelforall/building-cuda-applications-cmake/

答案 1 :(得分:0)

从CLion 2020.1版本开始,现已正式支持CUDA项目

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