【发布时间】:2021-03-17 01:58:45
【问题描述】:
我正在关注这个非常基本的 c++/pytorch 示例:
我可以毫无错误地浏览这个示例。但是,当使用 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 没有看到 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.h。 libtorch 目录中还有其他路径包含更多的头文件。我尝试将所有头文件添加到\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