我正在开发一个只包含头文件的库,我想使用clang-tidy来确保我遵循了"C++核心指南“https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
无论我怎么尝试,我似乎都不能整洁地在一个只有头的库上工作(可能是因为在使用这个库之前没有真正编译过任何东西)……但必须有一些变通方法才能使其正常工作。当然,其他人已经编写了一个只包含头文件的库,他们想在这个库上使用clang-tidy。
为了简化这个问题,我做了一个小的测试项目来尝试让它工作。这个项目只有两个文件。一个CMakeLists.txt文件和一个头文件。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.11.4)
project(my_project LANGUAGES CXX)
# This does not seem to work at all for header only libraries
# I even tried messing with the "-header-filter" parameter and had no luck
set(CMAKE_CXX_CLANG_TIDY clang-tidy;-checks=-*,cppcoreguidelines-*)
add_library(my_project INTERFACE)
target_include_directories(my_project
INTERFACE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)include/my_project.hpp:
#include <iostream>
// I know it is bad to do this in a header file.
// This is intentional to give clang-tidy something to catch
using namespace std;
template <int N>
void print()
{
for (int i = 0; i < N; ++i)
{
cout << "Hello, world!" << endl;
}
}当我运行CMake时:
mkdir build
cd build
cmake ..
cmake --build .我没有从clang-tidy得到任何输出。如何让clang-tidy解析头只包含库并报告潜在的问题?
发布于 2020-12-21 19:30:32
默认情况下,clang-tidy 会检查您的头文件。因此,为了指定头文件的根路径,有必要使用-header-filter=.*。
Not verbose clang-tidy输出并不意味着它不会执行。该配置缺少-header-filter=.*,但即使使用该标志,当您执行cmake --build .时,它也不会输出任何内容。但是,如果您使用grep在构建路径中查找该命令(例如),您应该会得到如下内容:
❯ grep -nrw '.' -e "clang-tidy"
./CMakeFiles/my_project.dir/build.make:63: $(CMAKE_COMMAND) -E __run_co_compile --tidy="clang-tidy;-checks=-*,cppcoreguidelines-*;-header-filter=.*" --source=/home/markoshorro/tmp/tidy/my_project.cpp -- /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/my_project.dir/my_project.cpp.o -c /home/markoshorro/tmp/tidy/my_project.cpp这意味着考虑使用clang-tidy命令。实际上,以您的示例为例:
❯ clang-tidy my_project.hpp
❯也就是说,我什么也得不到。看看this example (尽管您的示例在我看来没问题);只是clang-tidy没有什么可报告的。
发布于 2020-12-21 06:12:46
以下命令对我有效:
find . -type f \( -name "*.hpp" -o -name "*.cpp" \) \
-exec clang-tidy -p . \
--header-filter="/home/user/clang-tidy-include-headers/header.hpp" {} \;它查找头文件和CPP文件,并将它们传递给clang-tidy。参数--header-filter=接受头文件路径的正则表达式。
在您的情况下,它将是:
find . -type f \( -name "*.hpp" -o -name "*.cpp" \) \
-exec clang-tidy -p . \
--header-filter="include/" {} \;https://stackoverflow.com/questions/65350841
复制相似问题