仅使用CMake在QtCreator代码模型中设置预处理程序符号

mgdq6dx1  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(160)

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

ercv8c1e

ercv8c1e1#

在进一步挖掘之后,我发现了一个特定于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_CLANG_ANALYZER 1

# else

# define IN_CLANG_ANALYZER 0

# endif

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


# if IN_CLANG_ANALYZER 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),在语法检查期间没有定义宏,所以我们又回到了起点。

相关问题