neovim 中的 clang 为 c++/pytorch 基本示例提供 pp_file_not_found 错误

clang in neovim giving pp_file_not_found error for c++/pytorch basic example

我正在关注这个非常基本的 c++/pytorch 示例:

pytorch_installing

而且我可以毫无错误地完成这个示例。但是,当使用 neovim 创建 example-app.cpp 文件(或在任何时间点编辑它)时,clang 会抛出错误 'torch/torch.h' file not found [clang: pp_file_not_found]。我的 CMakeLists.txt 文件如下所示:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)

find_package(Torch REQUIRED)
include_directories(SYSTEM /home/username/Downloads/libtorch/)
set(CMAKE_PREFIX_PATH "/home/username/Downloads/libtorch/share/cmake/Torch")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

对于这个小项目,这对我来说不是什么大问题。但我将使用 libtorch 开展一个更大的项目,并希望 clang 能够识别 。有几个类似的 Whosebug 问题,但没有答案。

更新:

我相信这是因为 clang 没有看到 torch/torch.h 因为它不是包含路径的一部分。我打印了 clang 的包含路径,但它不在列表中。因此,我尝试将 libtorch 的包含路径添加到 /usr/include/ 但随后它无法看到我添加的头文件引用的其他头文件。所以我将 libtorch/include/torch/csrc/api/include/torch/ 目录添加到 /usr/include 以便它可以读取 #include <torch/torch.h。但是在libtorch/include/torch/csrc/api/include/torch/路径之外的指定目录路径的那些头文件中引用了其他头文件。

例如,libtorch/include/torch/csrc/ 包含 WindowsTorchApiMacro.hlibtorch 目录中还有其他路径包含更多头文件。我试图将所有头文件添加到 \usr\include 但仍然收到错误。我确定需要使用整个包。原始 cmake 文件如下所示:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)

find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

所以 cmake 能够正确地找到并引用所有这些头文件,而且我知道你可以在命令行用 clang 编译它,但是 neovim 中的 clang(在编辑期间)如何正确无误地看到这个包?我考虑过使用像 vcpkg 这样的包管理器,但不幸的是,他们没有可用的 libtorch。如果需要,我可以包含详细且成功的 cmake 运行 的输出。

由于cmake-make编译成功,可以要求CMake用cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1.

生成编译数据库(通常是compile_commands.json文件)

一旦文件可用,它就可以被自动完成编译器(在本例中为 clang)读取,这可以防止自动完成器在文件系统中丢失,因为所有标志和 headers 都已指定编译单元。 编译数据库只需要放在自动完成插件期望的地方。