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

#c #cmake #pytorch #clang #libtorch

#c #cmake #pytorch #clang #libtorch

Вопрос:

Я следую этому очень простому примеру 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 , которые содержат больше файлов заголовков. Я попытался добавить все заголовочные файлы usrinclude , но все равно получил сообщение об ошибке. Я уверен, что необходимо использовать пакет в целом. Исходный файл 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.

Комментарии:

1. Просто чтобы убедиться, что я понимаю: если вы создаете свой проект cmake — make, настройка работает, и компиляция завершается успешно, но, с другой стороны, компилятор clang внутри neovim (для автозаполнения, я полагаю) не может найти заголовки, и, следовательно, ваше автоматическое завершение нарушается. Это правильно?

2. @trialNerror, да. Он не распознает <torch/torch.h>, и поэтому каждая ссылка на torch становится ошибкой в neovim, и если я помещаю #inlcude <torch/torch.h> ее в начало файла, последующие #include ,... файлы не читаются должным образом и также становятся ошибками. Я могу сделать снимок экрана, если это поможет.

3. Хорошо, тогда поддерживает ли ваш плагин autompletion базы данных компиляции (например, YouCompleteMe)? Это был бы самый простой способ решить эту проблему. CMake можно настроить для создания базы данных компиляции, которую вы затем предоставляете своему автозаполнителю. В этом файле указаны все необходимые флаги и пути для всех модулей компиляции в вашем проекте, и, таким образом, ваш neovim clang больше не может допускать ошибок или теряться в вашей файловой системе

4. Спасибо, что указали мне правильное направление. Итак, мне нужно было включить генерацию файла в моей сборке CMake, добавив cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 в мою сборку, чтобы сгенерировать compile_commands.json файл в каталоге сборки. Затем я просто переместил этот файл из каталога сборки в корень моего проекта, и это устранило проблему. Спасибо! Не стесняйтесь добавлять это к ответу, и я дам награду.

5. Насколько я знаю, на самом деле нет. У меня, например, просто есть libs папка в моем доме, в которой я сохраняю все сторонние библиотеки (например, torch, sfml, вы называете это …)

Ответ №1:

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

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