Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 代码解析不适用于CUDA、Clion和CMake_C++_Cmake_Cuda_Clion - Fatal编程技术网

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

C++ 代码解析不适用于CUDA、Clion和CMake,c++,cmake,cuda,clion,C++,Cmake,Cuda,Clion,我有一个分为模块的项目,下面是一个虚拟示例: 根 CMakeLists.txt 模块 乌提尔斯 CMakeLists.txt src util_file.cpp 库达 CMakeLists.txt src cuda_file.cu 如果我用CLion编辑cuda_file.cu,所有符号都无法通过CLion解析(甚至包括标准库中的符号)所有代码完成/创建功能当然都会消失(除其他外)。问题似乎是,每当你创建一个只包含CUDA文件的库或可执行文件时,Clion就会变得愚蠢

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

    • CMakeLists.txt
    • 模块
      • 乌提尔斯
        • CMakeLists.txt
        • src
          • util_file.cpp
      • 库达
        • CMakeLists.txt
        • src
          • cuda_file.cu
如果我用CLion编辑cuda_file.cu,所有符号都无法通过CLion解析(甚至包括标准库中的符号)所有代码完成/创建功能当然都会消失(除其他外)。问题似乎是,每当你创建一个只包含CUDA文件的库或可执行文件时,Clion就会变得愚蠢,不再解析或解析任何东西

我发现有两种变通方法,但它们不友好,也不“干净”:

  • 将空的.cpp文件添加到目录中,并将其添加到add_library()CMake行
  • 切换到另一个具有.cpp文件的库或可执行目标(如我的虚拟示例中的UTIL)。但是,当您想要编译或执行时,您必须再次切换到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


我已经在CLion选项中添加了.cu和.cuh文件作为C/C++代码,并尝试使用JETBRAINS\u IDE define选项,正如另一篇类似文章中所解释的,但这两个问题并不相同

似乎没有JETBRAINS的干预来添加官方CUDA支持,我能从CLion+CMake+CUDA组合中获得的最大收获是:

    在克利永中添加Cu和CuH作为C++文件。这允许CYON将CUDA代码识别为C++代码并正确地着色。
  • 在cuda源目录中添加一个空的dummy.cpp文件,如果它只由.cu文件填充(我的问题中的一个“脏”黑客)。我找不到更好的了。这允许Clion不完全derp。一件简单的事情,比如识别cstdio,如果没有这个“黑客”就无法工作,而CLion基本上是一个增强的记事本
  • 尽可能使用正式支持CUDA作为语言的CMake 3.8+,并使用新的“CUDA感知”add_library()而不是旧的宏定义的CUDA_add_library()。这可以避免将来出现弃用问题
  • 在cuda模块的CMakeLists(或主CMakeLists,如果只有一个),包括cuda的include目录的路径,以允许Clion“查看”cuda头。然后,CLion可以建议您包含它们,以便CLion正确解析CUDAAPI调用,如cudamaloc()或cudaFree()。这仅适用于CLion,因为CUDA编译器不需要正确编译(CUDA.h,CUDA_runtime.h,…)
  • 使用此选项可以创建“clion helper”头文件,这样它就不会对诸如“设备”或“全局”之类的符号进行derp
我认为,如果Jetbrains开始添加对CUDA的支持,不仅会消除添加此虚拟文件的需要,而且可能还会解决列出的所有其他问题


这里是英伟达博客的链接,上面有CuAd官方CUDA语言支持和新的“CUDA意识”AddiLabar():

< P>克利永的2020.1版,CUDA项目现在正式支持


我在添加到CLion的.cu type的末尾用粗体指定了可能的重复项。此外,特殊的CUDA符号(主机)也不是问题。您阅读了所有的答案吗?其他人明确表示,除非添加预处理器技巧,否则Clion无法解析cuda。我不希望Clion正确解析或理解cuda特殊符号或内核,我只希望他进行标准代码解析,这样整个文件就不会是红色的(与只有cuda符号是红色的不同)。出于某种原因,在CMake编译过程中添加一个空的CPP文件,使他能够正确地解决所有问题……为了确保这一点,我还尝试使用#define JETBRAINS_IDE选项,但正如我所说的,这是另一个问题,因为它没有改变任何东西