cmake 仅在QtCreator代码模型中设置预处理器符号

6tqwzwtp  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(208)

我正在做一个基于CMake的项目,它包含C和CUDA源文件,并且有一些头文件意味着这两种语言都包含在内。
对于这些头文件,我希望看到高亮显示和语法检查的结果尽可能接近NVCC(CUDA编译器)所看到的结果,例如,我希望定义预处理器符号__CUDACC__
对我来说,CMake没有定义这样的符号是很重要的,因为它实际上是NVCC工具链的内部符号,我需要它来进行语法检查。
我试过“Tools->C
->Additional preprocessor directives”,似乎没有效果。我也尝试了一个名为CMakeLists.txt.config的文件,似乎也没有效果。
我想听听你的建议。重申一下,我正在寻找一种方法来设置一个只对语法检查系统可见的define(CPP符号/宏)。

htrmnn0y

htrmnn0y1#

我刚刚发现了this post,它揭示了我最初问题的正确答案。原来在语法检查期间,Qt Creator定义了Q_CREATOR_RUN宏。
因此,需要检查其定义:

#if defined(Q_CREATOR_RUN) || defined(__INTELLISENSE__)
#  define IN_SYNTAX_CHECKER 1
#else
#  define IN_SYNTAX_CHECKER 0
#endif

在上面的示例中,我还检查是否定义了__INTELLISENSE__,以便在Visual Studio和VS Code中也可以使用相同的逻辑。
[kept出于考古学原因-更好的答案在上面]
经过进一步的挖掘,我发现了一个特定于Clang分析器的属性,该属性是在语法检查的分析过程中定义的,而不是在编译过程中定义的。
请注意,这纯粹是因为我的项目使用GCC编译,而QT Creator的语法检查通过Clang运行。

// GCC and NVCC don't have __has_feature(), so we provide a fallback
#ifndef __has_feature 
#  define __has_feature(x) 0
#endif

#if __has_feature(attribute_analyzer_noreturn)
#  define IN_SYNTAX_CHECKER 1
#else
#  define IN_SYNTAX_CHECKER 0
#endif

这允许笨拙的黑客如下,这可能是有用的,也可能不是有用的,这取决于一个人的需要。基本上这个想法是,即使你用GCC编译,你也会让Clang观察你的代码,这对NVCC使用的文件来说也是类似的。

#if IN_SYNTAX_CHECKER and !defined(__CUDACC__)
#  define __CUDACC__
#  include <cuda_device_runtime_api.h>
#  include <optix_device.h>
#endif
  • 然而 * 实质性的问题仍然存在,当使用Clang编译时,上述所有内容都没有表现出来,因为编译器clang++也定义了相同的功能。

要解决这个问题,需要在分析器中定义某种宏,但Clang中没有,到目前为止,我还没有找到这样的宏。起初我希望__clang_analyzer__能满足这个需求,但是根据我的Qt Creator版本(6.0.2),语法检查时没有定义宏,所以我们又回到了原点。

相关问题