代码解析不适用于 CUDA、Clion 和 CMake
Code parsing not working with CUDA, Clion and CMake
我有一个分为模块的项目,这里是一个虚拟示例:
- 根
- CMakeLists.txt
- 模块
- 工具
- CMakeLists.txt
- 来源
- util_file.cpp
- 库达
- CMakeLists.txt
- 来源
- cuda_file.cu
如果我用 CLion 编辑 cuda_file.cu,CLion 无法解析所有符号(甚至是标准库中的包含)。 所有代码 completion/creation 功能当然都消失了(除其他外)。问题似乎是,每当您创建仅包含 CUDA 文件的库或可执行文件时,Clion 就会变得愚蠢并且不再解析或解析任何内容。
我找到了两个解决方法,但它们不友好或 "clean" 无法使用:
- 向目录添加一个空的 .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)
在解析指向其他 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.h,cuda_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/
我有一个分为模块的项目,这里是一个虚拟示例:
- 根
- CMakeLists.txt
- 模块
- 工具
- CMakeLists.txt
- 来源
- util_file.cpp
- 库达
- CMakeLists.txt
- 来源
- cuda_file.cu
- 工具
如果我用 CLion 编辑 cuda_file.cu,CLion 无法解析所有符号(甚至是标准库中的包含)。 所有代码 completion/creation 功能当然都消失了(除其他外)。问题似乎是,每当您创建仅包含 CUDA 文件的库或可执行文件时,Clion 就会变得愚蠢并且不再解析或解析任何内容。
我找到了两个解决方法,但它们不友好或 "clean" 无法使用:
- 向目录添加一个空的 .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)
在解析指向其他 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.h,cuda_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/