clang в neovim, выдающий ошибку pp_file_not_found для базового примера c++/pytorch

Я следую этому очень простому примеру c++/pytorch:

pytorch_installing

И я могу пройти этот пример без ошибок. Однако при создании файла example-app.cpp (или его редактировании в любой момент времени) с помощью neovim 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›. Была пара похожих вопросов по 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.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, но как clang в neovim (во время редактирования) может увидеть этот пакет без ошибок? Я думал об использовании менеджера пакетов, такого как vcpkg, но, к сожалению, у них нет libtorch. При необходимости я могу включить вывод подробного и успешного запуска cmake.


person d84_n1nj4    schedule 05.12.2020    source источник
comment
Просто чтобы убедиться, что я понимаю: если вы cmake-создаете свой проект, установка работает, и компиляция проходит успешно, но, с другой стороны, компилятор clang внутри neovim (я полагаю, для автодополнения) не может найти заголовки и, таким образом, ваше автодополнение нарушено . Это примерно правильно?   -  person trialNerror    schedule 08.12.2020
comment
@trialNerror, да. Он не распознает ‹torch/torch.h›, поэтому каждая ссылка на torch становится ошибкой в ​​neovim, и если я поставлю #inlcude <torch/torch.h> в начало файла, последующие #include ,... не будут правильно считаны и тоже станут ошибками. Могу сделать скриншот, если поможет.   -  person d84_n1nj4    schedule 08.12.2020
comment
Итак, ваш плагин автозаполнения поддерживает базы данных компиляции (например, YouCompleteMe)? Это был бы самый простой способ решить эту проблему. CMake можно настроить для создания базы данных компиляции, которую вы затем предоставляете автозаполнению. В этом файле указываются все необходимые флаги и пути для всех модулей компиляции в вашем проекте, поэтому ваш neovim clang больше не может ошибаться или теряться в вашей файловой системе.   -  person trialNerror    schedule 08.12.2020
comment
Спасибо, что указали мне правильное направление. Поэтому мне нужно было включить генерацию файлов с моей сборкой CMake, добавив cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 в мою сборку, чтобы сгенерировать файл compile_commands.json в каталоге сборки. Затем я просто переместил этот файл из каталога сборки в корень моего проекта, и это решило проблему. Спасибо! Не стесняйтесь добавлять это к ответу, и я дам награду.   -  person d84_n1nj4    schedule 08.12.2020
comment
@trialNerror, один побочный вопрос. Где мне хранить libtorch в Ubuntu? В настоящее время он просто находится в папке «Загрузки». Есть ли стандартное место для libtorch или любого другого внешнего пакета, если на то пошло?   -  person d84_n1nj4    schedule 09.12.2020
comment
Не совсем, насколько я знаю. Например, у меня дома есть папка libs, в которой я сохраняю все сторонние библиотеки (такие как torch, sfml и так далее...)   -  person trialNerror    schedule 09.12.2020


Ответы (1)


Поскольку компиляция выполняется с помощью cmake-make, можно попросить CMake сгенерировать базу данных компиляции (обычно файл compile_commands.json) с помощью cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1.

Как только файл доступен, он может быть прочитан компилятором автодополнения (в данном случае clang), что предотвращает потерю автодополнения в файловой системе, поскольку все флаги и заголовки указаны для всех единиц компиляции. Базу данных компиляции просто нужно поместить туда, где ее ожидает плагин автозаполнения.

person trialNerror    schedule 08.12.2020