#source-file #checking #compiler #command #clang #command-line-tool

app cpp-typecheck

使用clang编译数据库对C++源文件进行类型检查

13个版本

使用旧Rust 2015

0.5.0 2020年6月27日
0.4.0 2018年1月5日
0.3.8 2016年12月3日
0.3.7 2016年9月2日
0.2.1 2016年8月23日

#778 in 文件系统

BSD-3-Clause

25KB
450 代码行

Build Status

cpp-typecheck

一个命令行工具,用于使用clang编译数据库对C++源文件进行类型检查。

cpp-typecheck从数据库中提取给定源文件的编译命令,执行它并输出编译器的输出。

cpp-typecheck的设计是为了获取最简化的程序,无需任何配置,只需直接运行并易于集成到编辑器中。

数据库包含项目所有源文件的编译命令 - 包含所有标志、定义和包含 -。获取数据库的最简单方法是通过调用带有选项的cmake构建项目:cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON。在项目完全重建后,构建目录的根目录将包含一个名为compile_commands.json的数据库。

有几个程序使用数据库并执行类型检查,例如rtagsYouCompleteMe,但它们要么在rtags的情况下异步执行类型检查,这使得它们难以集成到多个编辑器中,要么在YouCompleteMe的情况下相当重,配置困难,并且使我的首选编辑器vim运行缓慢。

另一个问题是,这些程序有时使用clang进行类型检查,而不是数据库中使用的编译器,这可能会在类型检查和构建时产生不同的警告,这有时不是期望的行为。

cpp-typecheck不适合即时类型检查 - 在这种情况下,异步解决方案更为合适 - 它旨在用于同步按需类型检查 - 通过按编辑器的快捷键 - 配置简单。

安装

cpp-typecheck 是使用 Rust 编译的,因此至少需要 rustccargo 来构建它。

获取这两个工具的最简单方法是使用 rustup

$> curl https://sh.rustup.rs -sSf | sh

调用此命令后,你应该会在 ~/.cargo/bin/ 下有 rustccargo 的可执行文件,因此建议将其路径添加到 PATH 环境变量中。

对于非 Unix 类平台,请参阅 这里

现在构建并安装 cpp-typecheck

$> cargo install cpp-typecheck

构建的二进制文件将位于 ~/.cargo/bin/cpp-typecheck

用法

检查源文件

$> cpp-typecheck  /absolute_path_to/SomeSource.cpp

这将向上搜索从目录 /absolute_path_to/ 开始的目录树中的名为 compile_commands.json 的数据库。然后在数据库中查找 SomeSource.cpp,执行编译命令,并输出编译器的输出。

这使得可以将 cpp-typecheck 作为编译器的替代品用于解析编译器输出并显示错误的编辑器。

如果数据库不能通过源文件目录访问,则还必须提供数据库。

$> cpp-typecheck  /absolute_path_to/SomeSource.cpp  path_to/compile_commands.json

只要编译器参数兼容(如 gcc 和 clang 的情况),也可以使用数据库中定义之外的其他编译器进行类型检查。

$> cpp-typecheck  --compiler clang  /absolute_path_to/SomeSource.cpp

文本编辑器集成

vim-cpp-typecheck

可能出现的问题

源文件的编译命令被缓存于 ~/.cpp_typecheck/cache/cmds 中,这样相同的源文件进行多次类型检查时就不需要再次在数据库中查找命令。通常情况下,这不应该是一个问题,因为数据库中的命令很少发生变化,但如果有问题,则可以清除 ~/.cpp_typecheck/cache/cmds 中的缓存。

还有 --no-cache 选项,可以忽略缓存,并始终在数据库中查找编译器命令。

依赖关系

~4–14MB
~170K SLoC