【问题标题】:clang in neovim giving pp_file_not_found error for c++/pytorch basic example在 neovim 中发出 c++/pytorch 基本示例的 pp_file_not_found 错误
【发布时间】:2021-03-17 01:58:45
【问题描述】:

我正在关注这个非常基本的 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 开展一个更大的项目,并希望能够识别 。有几个类似的 Stackoverflow 问题,但没有答案。

更新:

我相信这是因为 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 - 制作你的项目,设置工作并且编译成功,但另一方面,neovim 中的 clang 编译器(我假设用于自动完成)无法找到标题,因此您的自动完成功能被破坏。对吗?
  • @trialNerror,是的。它无法识别 ,因此每次对torch 的引用都会在neovim 中成为一个错误,如果我将#inlcude <torch/torch.h> 放在文件顶部,则后续的#include ,... 将无法正确读取并且也成为错误。如果有帮助,我可以截屏。
  • 好吧,您的自动完成插件是否支持编译数据库(例如,YouCompleteMe 支持)?这将是解决这个问题的最直接的方法。可以将 CMake 设置为生成编译数据库,然后将其提供给自动完成程序。该文件为您的项目中的所有编译单元明确了所有必需的标志和路径,因此您的 neovim clang 不会再真正出错或迷失在文件系统中
  • 感谢您为我指明正确的方向。因此,我需要通过将cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 添加到我的构建以在构建目录中生成compile_commands.json 文件来启用我的CMake 构建的文件生成。然后我只是将该文件从构建目录移动到我的项目的根目录,它解决了这个问题。谢谢!随意将其添加到答案中,我会给予赏金。
  • 不是真的,据我所知。例如,我家中只有一个libs 文件夹,其中保存了所有第三方库(如torch、sfml,你可以命名它......)

标签: c++ cmake pytorch clang libtorch


【解决方案1】:

由于使用 cmake-make 编译成功,因此可以使用 cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 要求 CMake 生成编译数据库(通常为 compile_commands.json 文件)。

一旦文件可用,它就可以被自动完成编译器(在这种情况下为clang)读取,这可以防止自动完成程序在文件系统中丢失,因为所有编译单元都指定了所有标志和标头。 编译数据库只需放在自动补全插件期望的位置即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 2017-10-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多