【问题标题】:clang-tidy can't locate stdlib headersclang-tidy 找不到 stdlib 头文件
【发布时间】:2020-02-16 09:16:23
【问题描述】:

今天我从源代码构建了 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-tidy 仅适用于 Unix Makefiles 和 Ninja 生成器(或可能其他一些)。我通常使用 xcode 生成器,但我对这两个不太熟悉,所以我并不真正关心其他人。我尝试使用 Unix Makefiles 和 Ninja 生成和构建项目,但两者都出现此错误:

/Users/xxxxxxx/Dev/VSCodePlayground/helloworld.cpp:2:10: error: 'string' file not found [clang-diagnostic-error]

我找到了一些信息,这可能是因为 clang 找不到 libc++/stdlib 头文件。因此,我尝试使用 -v 参数进行建议编译(成功且没有错误),并在包含目录中获得了此输出:

#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 知道,对吗?但是我应该如何解决这个问题以及导致这个问题的原因?

【问题讨论】:

  • 我认为这不是你的问题,因为你在.cpp 文件中看到了这个错误,但我在.h 文件和@987654321 中遇到了同样的问题@;也许它会帮助你。

标签: macos clang clang-tidy


【解决方案1】:

如果我理解问题是 clang-tidy 不知道 libc++ 标头的位置,而 clang 知道,对吗?

我碰巧遇到了同样的问题。而且一开始确实不明显为什么clang-tidy调用的编译没有检测到安装的libc++。

事实证明,如果 compile_commands.json 包含指向 clang 的符号链接,它将无法找到 libc++。它相对于“安装目录”进行搜索,这是 clang 二进制位置,但不遵循符号链接。而且找不到。

在此报告:https://bugs.llvm.org/show_bug.cgi?id=47460

作为一种解决方法,您可以将编译器的完整路径传递给 CMake,这样生成的 compile_commands.json 将与 clang-tidy “兼容”。路径需要来自实际安装目录,注意clang++仍然是clang++的符号链接,这很重要,但要确保目录正确。

至少这是我在 Ubuntu 机器上的问题。你的看起来很相似,所以很可能是同一个问题。虽然我不知道 XCode 是如何管理工具链的,但它可能完全是另外一回事 :)

【讨论】:

  • 这解决了我的问题。
【解决方案2】:

今天我尝试了clangd,我得到了一个非常相似的问题。

Clangd 告诉我,'string' 文件未找到,'cstring' 文件未找到...

我终于修好了。我将arg "--query-driver=/usr/bin/clang++"添加到clangd,现在它工作正常,现在可以找到标题了。

C++ 头文件应该在文件夹/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 中。 如果你通过 homebrew 安装 llvm,文件夹/usr/local/Cellar/llvm/12.0.1/include/c++/v1 也应该有一个。

这里有更多信息。

  • 编辑:VS Code 分机clangd
  • 操作系统:Mac 10.15
  • cmake
  • clang 版本:12.0

这里有一些链接。

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2016-05-17
    • 1970-01-01
    • 2021-09-06
    • 2018-03-20
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多