小编cer*_*gni的帖子

如何将clang-tidy集成到CMake和GCC?

我想将clang-tidy集成到我们的C和C ++,基于CMake的项目中,该项目使用自定义GCC工具链进行编译。

我尝试按照本教程进行设置CMAKE_CXX_CLANG_TIDY。我还尝试通过设置并指向其目录CMAKE_EXPORT_COMPILE_COMMANDS来生成编译数据库。ONrun-clang-tidy.py

在这两种情况下,我都遇到(相同)一些可能与Clang和GCC之间的差异有关的错误:

  1. 在Clang中不支持在CMake文件中启用的某些警告标志,但在GCC中受支持(例如-Wlogical-op)。由于编译器是GCC,因此文件可以正确构建,并且将标志写入编译数据库,但是会clang-tidy抱怨。
  2. clang-tidy抱怨一些定义,并且功能不可用,即使代码可以很好地编译。例如,建议使用android-cloexec-open检查O_CLOEXEC来提高安全性并强制关闭文件,但是尝试使用此定义会导致未定义的标识符错误(即使我们的GCC编译了代码)。作为未找到功能的示例,有clock_gettime

我们的代码使用C11标准和C ++ 14标准进行编译,而没有GNU扩展:

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)

set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_EXTENSIONS OFF)
Run Code Online (Sandbox Code Playgroud)

定制工具链是交叉编译工具链,可在Linux上运行并编译为FreeBSD。

  1. 有没有办法禁止CMake将某些标志传递给clang-tidy?我是否使用clang-tidy错误?
  2. 我怀疑此问题与使用交叉编译工具链禁用GNU扩展以及一些功能测试宏有关,该宏未在Clang中默认定义,而是由GCC定义(例如_GNU_SOURCE/ _POSIX_SOURCE)。如果是这种情况,我该如何检查?如果没有,我应该另外使用clang-tidy吗?

编辑

按照@ pablo285的要求,对于单个文件,我会收到2条警告,然后按照我的添加--warnings-as-errors=*,构建停止:

error: unknown warning option '-Wlogical-op' ; did you mean '-Wlong-long'? [clang-diagnostic-error]

<file path>: error: use of undeclared identifier 'O_CLOEXEC' [clang-diagnostic-error]
O_WRONLY | O_CLOEXEC
           ^
Run Code Online (Sandbox Code Playgroud)

我决定编写一个Python脚本来替换clang-tidy,从CMake接收命令行并对其进行编辑以修复各种错误。这是我尝试的命令行修改:

  1. 删除所有clang编译标志
    • 这对于第一个警告之类的事情很有帮助,因为现在我不传递clang不知道的标志。似乎我无法配置CMake将不同的标志集传递给GCC和整洁,因此,如果有人熟悉该问题的某些解决方案,我将很高兴听到!
  2. 我更改了传递给clang-tidy的包含目录
    • 正如文章中提到的,我使用了一个自定义工具链(交叉编译)。我使用了这篇文章和Python来提取标准包含目录的列表,并将它们作为的列表添加到标志列表中-isystem <dir>。我还添加了内容, …

c++ gcc cmake clang clang-tidy

7
推荐指数
1
解决办法
533
查看次数

标签 统计

c++ ×1

clang ×1

clang-tidy ×1

cmake ×1

gcc ×1