Я использую 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"
Добавлен запрошенный минимальный воспроизводимый пример.
Извините за задержку. Попробуйте указать абсолютный путь вместо src/main.cpp
в compile_commands.json
.
Добавление его к обеим частям "file":
и/или "arguments":
не изменило ситуацию (между ними я очистил индекс clangd). Я почти уверен, что "directory":
в compile_commands.json
все равно учитывается, поэтому я не удивлен. В качестве отступления: поскольку compile_command.json
создается с помощью clang++, изменения в нем в любом случае не сохраняются. На самом деле со мной все в порядке, если нет четкого/очевидного решения. Просто подумал, может у кого-то уже есть известное решение. Спасибо за твою поддержку. (Не уверен, стоит ли мне отмечать вопрос решенным, если решение не найдено...)
Хорошо, я воспроизвел это. Кажется, это ошибка в MissingIncludes: Strict
(если вы удалите этот параметр и удалите включение, будет предложено правильно добавить недостающее включение, без полного пути). Предлагаю сообщить об этом. Затем вы можете опубликовать ответ ниже (со ссылкой на ошибку) и нажать галочку рядом с ним, чтобы отметить вопрос как решенный.
Спасибо за вашу поддержку/усилия. Я последовал вашему предложению и сообщил об ошибке. При удалении опции из .clangd
не будут отображаться какие-либо подсказки или параметры быстрого исправления. Примечание. При наведении курсора на ключевое слово типа Subheader
на информационной панели при наведении отображается: provided by: "/path/to/working/directory/include/Subheader.h"
. То же самое делаем с Header
состояниями: provided by: "Header.h"
Я последовал предложению HolyBlackCat
и сообщил об ошибке здесь.
Никогда не случалось со мной. Нам понадобится минимальный воспроизводимый пример (ваша структура каталогов,
compile_commands.json
и/или конфигурация Clangd и т. д.).