Добавить недостающие включения без пути

Я использую clangd с VSCode. Clangd предлагает возможность добавлять недостающие включения. При этом он (иногда? не мог понять когда) автоматически добавляет относительный или абсолютный путь к директиве include.

Последнее вызывает проблемы при компиляции в разных ОС (в моем случае Linux и Termux (на моем мобильном телефоне)) поскольку абсолютные (системные) пути явно различаются.

Например, вместо

#include "Header.h"

это добавит

#include "/home/user/path/to/the/Header.h"

Конечно, я могу вручную удалить путь, но мне интересно:

Кто-нибудь знает, есть ли возможность отключить это поведение и исключить путь? Я пытался поискать в Гугле, но, к сожалению, ничего не нашел...

заранее спасибо

Обновлено: минимальный пример

Структура:

./
- .clangd
- compile_commands.json
- bin/
- build/
- include/
--- Header.h
--- Subheader.h
- src/
--- main.cpp`

Содержание:

// .clangd
Diagnostics:
  UnusedIncludes: Strict
  MissingIncludes: Strict
// Subheader.h
#ifndef IG20240815185417
#define IG20240815185417

struct Subheader {
    int i{2};
};

#endif
// Header.h
#ifndef IG20240520170135
#define IG20240520170135
    
#include "Subheader.h"
    
struct Header {
  Subheader sh{};
};

#endif
// main.cpp
#include "Header.h"

int main() {
  Header h{};
  Subheader sh{};
  return 0;
}

Команда компиляции (с созданием compile_commands.json):

clang++ -o build/main.o -c src/main.cpp -MJ build/main.o.json -I./include && clang++ -o bin/main.exe build/main.o && sed -e '1s/^/[\n/' -e '$s/,$/\n]/' build/*.o.json > compile_commands.json

Обратите внимание, что compile_commands.json будет создан с помощью команды компиляции. Если это не работает на вашем компьютере, вот основная команда компиляции и окончательное содержимое файла .json. Вам придется настроить каталог в соответствии с вашей системой!

Скомпилировать команду (без создания compile_commands.json):

clang++ -o build/main.o -c src/main.cpp -I./include && clang++ -o bin/main.exe build/main.o
// compile_commands.json
[
{ "directory": "/ABSOLUTE/PATH/TO/WORKING/DIRECTORY", "file": "src/main.cpp", "output": "build/main.o", "arguments": ["/usr/bin/clang++", "-xc++", "src/main.cpp", "-o", "build/main.o", "--driver-mode=g++", "-c", "-I", "./include", "--target=x86_64-pc-linux-gnu"]}
]

Наблюдение:

При просмотре main.cpp (в VSCode) под Subheader отображается синяя волнистая линия, намекающая на то, что соответствующий заголовок отсутствует/не включен напрямую (но известен через Header.h). При выборе опции QuickFix добавляется следующая директива include: #include "/path/to/working/directory/include/Subheader.h"

Никогда не случалось со мной. Нам понадобится минимальный воспроизводимый пример (ваша структура каталогов, compile_commands.json и/или конфигурация Clangd и т. д.).

HolyBlackCat 15.08.2024 16:40

Добавлен запрошенный минимальный воспроизводимый пример.

SinixND 15.08.2024 19:29

Извините за задержку. Попробуйте указать абсолютный путь вместо src/main.cpp в compile_commands.json.

HolyBlackCat 17.08.2024 18:46

Добавление его к обеим частям "file": и/или "arguments": не изменило ситуацию (между ними я очистил индекс clangd). Я почти уверен, что "directory": в compile_commands.json все равно учитывается, поэтому я не удивлен. В качестве отступления: поскольку compile_command.json создается с помощью clang++, изменения в нем в любом случае не сохраняются. На самом деле со мной все в порядке, если нет четкого/очевидного решения. Просто подумал, может у кого-то уже есть известное решение. Спасибо за твою поддержку. (Не уверен, стоит ли мне отмечать вопрос решенным, если решение не найдено...)

SinixND 20.08.2024 00:32

Хорошо, я воспроизвел это. Кажется, это ошибка в MissingIncludes: Strict (если вы удалите этот параметр и удалите включение, будет предложено правильно добавить недостающее включение, без полного пути). Предлагаю сообщить об этом. Затем вы можете опубликовать ответ ниже (со ссылкой на ошибку) и нажать галочку рядом с ним, чтобы отметить вопрос как решенный.

HolyBlackCat 20.08.2024 06:25

Спасибо за вашу поддержку/усилия. Я последовал вашему предложению и сообщил об ошибке. При удалении опции из .clangd не будут отображаться какие-либо подсказки или параметры быстрого исправления. Примечание. При наведении курсора на ключевое слово типа Subheader на информационной панели при наведении отображается: provided by: "/path/to/working/directory/include/Subheader.h". То же самое делаем с Header состояниями: provided by: "Header.h"

SinixND 20.08.2024 22:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я последовал предложению HolyBlackCat и сообщил об ошибке здесь.

Другие вопросы по теме