今天,我已经从源代码构建了clang-tidy,我已经使用clang ++构建了它。构建完成后,我创建了指向可执行文件的符号链接,如下所示:
ln -s /path/to/build/bin/clang-tidy /usr/local/bin/clang-tidy
然后,我尝试在简单项目(包含打印helloworld代码的单个.cpp文件)中将clang-tidy与cmake一起使用。这是我的cmake文件的样子:
project(Test)
cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
set(CMAKE_CXX_STANDARD 17)
set(CXX_STANDARD_REQUIRED)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_CLANG_TIDY
clang-tidy;
-checks=*;)
add_executable(Test
helloworld.cpp)
我在某处读到,使用cmake进行整洁的操作仅适用于Unix Makefile和Ninja生成器(或其他某些生成器)。我通常使用xcode生成器,但是我对这两个不熟悉,因此我并不真正在乎其他人。我尝试使用Unix Makefile和Ninja生成和构建项目,但同时出现此错误:
/Users/xxxxxxx/Dev/VSCodePlayground/helloworld.cpp:2:10: error: 'string' file not found [clang-diagnostic-error]
我发现了一些信息,这可能是由于clang找不到libc ++ / stdlib标头引起的。因此,我尝试了使用-v
参数的建议编译(成功编译,没有错误),并将此输出输出到include dirs:
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
如果我理解问题是clang-tidy却不知道libc ++标头的位置,而clang知道吗?但是我应该如何解决这个问题以及导致这个问题的原因?
答案 0 :(得分:1)
如果我了解问题是clang-tidy却不知道libc ++头文件的位置,那是吗?
我碰巧碰到了同样的问题。一开始,由clang-tidy调用的编译为什么没有检测到已安装的libc ++真的并不明显。
事实证明,如果compile_commands.json包含指向clang的符号链接,则它将找不到libc ++。它相对于“安装目录”(这是c二进制位置)进行搜索,但不遵循符号链接。而且找不到它。
在此处报告:https://bugs.llvm.org/show_bug.cgi?id=47460
作为一种解决方法,您可以将编译器的完整路径传递给CMake,这样生成的compile_commands.json将与clang-tidy“兼容”。路径必须来自实际的安装目录,请注意,clang ++仍然是clang ++的符号链接,这很重要,但是请确保该目录正确。
至少这是我在Ubuntu机器上的问题。您的看起来非常相似,因此可能是相同的问题。尽管我不知道XCode如何管理工具链,所以可能完全是其他问题:)