Как настроить VS Code для C++ с поддержкой clangd?

Отказ от ответственности: я полностью знаком с VS Code, поэтому, пожалуйста, будьте со мной осторожны. :-)

Я пытаюсь настроить VS Code для C++.
Однако я явно хочу настроить его так, чтобы он использовал Протокол языкового сервера для связи с clangd при обработке C++-файлы.

Я уже установил clangd в свою систему (Ubuntu Linux) и официальный "vscode-clangd" из маркета VS Code, а также я настроил его настройки так, чтобы clangd оно находилось.

Однако теперь я потерялся.
Когда я открываю файл *.cpp или *.hpp, VS Code рекомендует мне некоторые другие расширения (например, официальное Microsoft "C/C++" с поддержкой IntelliSense), но я не вижу, где и как clangd вообще мне помогает.

Использование расширения Microsoft «C/C++», кажется, работает «из коробки», но как я могу использовать clangd?

Спасибо за любую помощь.


person Deniz Bahadir    schedule 16.08.2018    source источник


Ответы (2)


Могу поделиться некоторыми своими настройками.

Расширение Microsoft "C/C++" отлично подходит для отладки, я думаю, вам стоит его установить.

MeanWhile, Clangd обеспечивает более точный результат при поиске ссылок. Итак, я предлагаю сохранить официальное расширение C/C++ для отладки, но отключить его intelliSense. Поместите строки ниже в свой settings.json

    "C_Cpp.intelliSenseEngine": "Disabled",
    "C_Cpp.autocomplete": "Disabled",  // So you don't get autocomplete from both extensions.
    "C_Cpp.errorSquiggles": "Disabled", // So you don't get error squiggles from both extensions (clangd's seem to be more reliable anyway).
    
    "clangd.path": "/path/to/your/clangd",
    "clangd.arguments": ["-log=verbose", "-pretty", "--background-index", "--compile-commands-dir=/path/to/your/compile_commands_dir/"]

При правильной настройке вы увидите вывод clangd из окон OUTPUT рядом с проблемами и терминалом.

введите описание изображения здесь

person George Zheng    schedule 20.01.2020
comment
У меня настроен clangd.arguments, но он размыт в settings.json, что это значит? - person frogEye; 26.05.2021
comment
@frogEye Обычно это означает, что эта функция устарела или не существует, я не уверен, почему это ваш случай, потому что эта функция наверняка существует и не устарела. Можешь попробовать добавить еще строчку конфига "clangd.checkUpdates": true и посмотреть, как дела? - person George Zheng; 28.05.2021
comment
Спасибо @George Zheng, я понял, что вся проблема связана с открытием рабочей области. Расширение не работало с рабочей областью, но когда я попытался открыть свой код в виде папки, он сработал. - person frogEye; 01.06.2021

Он должен работать без каких-либо настроек. Я проверил это в Windows, и оно работает просто отлично — у меня нет расширения C/C++, установленного в Visual Studio Code, только vscode-clangd, и оно сообщает об ошибках, обеспечивает завершение кода и т. д. Это означает, что расширение работает, потому что таких функций нет. в «основном» коде Visual Studio. Visual Studio Code по-прежнему предлагает популярные расширения C/C++, но вы можете игнорировать это, это не значит, что vscode-clangd не работает.

Обратите внимание, что файл, который вы редактируете, должен иметь стандартное расширение, такое как .cpp или .c, чтобы vscode-clangd мог его распознать и использовать. См. исходный код расширения для списка всех поддерживаемых расширений.

Для простых проектов может быть достаточно отсутствия конфигурации, но для более сложных вам, конечно, нужно будет сообщить Clang о таких вещах, как включение каталогов, флаги компиляции и т. д. Это можно сделать, создав файл compile_flags.txt, в котором вы вводите аргументы для Clang, по одному на строку. Вы можете поместить этот файл в ту же папку, что и ваши исходные файлы, или в любом другом месте дерева. После редактирования этого файла необходимо перезапустить Visual Studio Code, чтобы изменения вступили в силу.

В качестве альтернативы вы можете создать (или позволить CMake сгенерировать) файл compile_commands.json. Он имеет следующий синтаксис:

[
  { "directory": "/home/user/llvm/build",
    "command": "/usr/bin/clang++ -Irelative -DSOMEDEF=\"With spaces, quotes and \\-es.\" -c -o file.o file.cc",
    "file": "file.cc" },
  ...
]

Дополнительные сведения см. в документации Clang.

person Jan Joneš    schedule 07.09.2018