clangd pfade hinzufügen für autocomplete

Gast #7347427
Lesenswert?

Hallo guten Tag,

ich nutze clangd in Visual Studio Code. (Aber ich compiliere mit avr-gcc.) Man kann den Sprache-Server verwenden, damit man Code-Vervollständigungen erhält. Allerdings ist bei mir u.a. rot unterstrichen:

#include <avr/interrupt.h> #include <avr/io.h>

Wenn man mit der Maus drüber geht steht im Pop up u.a.

'avr/interrupt.h' file not foundclang(pp_file_not_found)

Jetzt habe ich versucht zu verstehen wie man neue Pfade hinzufügen kann aber noch keine Lösung gefunden..

Hat jemand eine Idee?

Danke sehr :)

#7347951
Lesenswert?

clangd sucht nach einer Datei namens compile_commands.json, in der für jede Datei die Compiler-Kommandzeile hinterlegt ist, mit der sie übersetzt wird. Daraus zieht er dann auch die Include-Pfade, Warnungs-Einstellung u.s.w. Wenn man z.B. mit cmake baut, kann einem das automatisch diese Datei erzeugen. Alternativ gibt's noch die Datei .clangd (bzw. muss angelegt werden), in der man auch projektspezifische Dinge wie Include-Pfade hinterlegen kann. Siehe https://clangd.llvm.org/config#compileflags

Gast #7350664
Lesenswert?

die Fehlermeldung "file not found" deutet darauf hin, dass der Sprach-Server die Header-Datei nicht finden kann. Um dies zu beheben, musst du Ihrem Build-System (in Ihrem Fall avr-gcc) mitteilen, wo sich die Header-Dateien befinden.

Sie können dies tun, indem du das Verzeichnis, das die Header-Dateien enthält, als Include-Verzeichnis angeben. In der Regel wird dies durch die Verwendung der -I-Option in Ihrem Build-System erreicht.

In Visual Studio Code kannst du das Include-Verzeichnis auch in der "c_cpp_properties.json"-Datei definieren, die sich im .vscode-Ordner befindet. Füge einfach das Verzeichnis, das die Header-Dateien enthält, zur "includePath"-Eigenschaft hinzu.

Beispiel:

"configurations": [ { "name": "My Configuration", "includePath": [ "${workspaceFolder}/**", "/pfad/zum/include/verzeichnis" ], "defines": [], "compilerPath": "/pfad/zum/compiler", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ],

Gast #7351695
Lesenswert?

Dgi schrieb:

In Visual Studio Code kannst du das Include-Verzeichnis auch in der "c_cpp_properties.json"-Datei definieren, die sich im .vscode-Ordner befindet. Füge einfach das Verzeichnis, das die Header-Dateien enthält, zur "includePath"-Eigenschaft hinzu.

Igendwie geht das immer noch nicht. Ich weiß auch gar nicht was mti "name": "linux-gcc-x64", gemeint ist. Den benutz ich doch gar nicht.. Ich werde dort mal avr-gcc eintragen?

1
{
2
    "configurations": [
3
        {
4
            "name": "linux-gcc-x64",
5
            "includePath": [
6
                "${workspaceFolder}/**",
7
                "/usr/lib/avr/include/avr/",
8
                "/usr/lib/avr/include",
9
                "/usr/lib/avr"
10
            ],
11
            "compilerPath": "/usr/bin/avr-gcc",
12
            "cStandard": "${default}",
13
            "cppStandard": "${default}",
14
            "intelliSenseMode": "linux-gcc-x64",
15
            "compilerArgs": [
16
                ""
17
            ]
18
        }
19
    ],
20
    "version": 4
21
}

Und meinem Buidl System habe ich auch noch make avr-gcc -g -Wall -mcall-prologues -mmcu=atmega328p -Os -I /usr/lib/avr/include/avr/ -c -o main.o main.c mittgeteilt...

Aber irgendwie fehlt da der Übergang zu clangd..

Habe auch mal eine .clangd - Datei angelegt.. mit : /usr/lib/avr/include/avr/

Aber das ändert nichts.

Gast #7352676
Lesenswert?

Rolf M. schrieb:

Format, wie in der Doku

https://clangd.llvm.org/config#pathmatch

Ich kann die Beschreibung zu den Pfaden nicht finden.

Habe folgendes verwendet, aber ich verstehe nicht und funktioniert auch nicht:

user configuration: a config.yaml file in an OS-specific directory: Linux and others: $XDG_CONFIG_HOME/clangd/config.yaml, typically ~/.config/clangd/config.yaml

In meiner yaml Datei..

/home/oem/.config/clangd/config.yaml

1
---
2
IncludePaths:
3
  - /path/to/avr/io.h
4
  - /usr/lib/avr/include/avr/io.h
5
  - /usr/lib/avr/include/avr/
6
  - /usr/lib/avr
#7352748
Lesenswert?

veganerBauer schrieb:

user configuration: a config.yaml file in an OS-specific directory: Linux and others: $XDG_CONFIG_HOME/clangd/config.yaml, typically ~/.config/clangd/config.yaml

Du kannst sie entweder dort ablegen (hab ich jetzt nicht ausprobiert) oder im Wurzelverzeichnis deines Projekts als .clangd Letzteres hat dann den Vorteil, dass du für jedes Projekt eine eigene Config erstellen kannst.

IncludePaths:

So etwas kann ich auf dieser Webseite nicht finden. Ich meinte entsprechend diesem Beispiel:

1
CompileFlags:                     # Tweak the parse settings
2
  Add: [-xc++, -Wall]             # treat all files as C++, enable more warnings
3
  Remove: -W*                     # strip all other warning-related flags
4
  Compiler: clang++               # Change argv[0] of compile flags to `clang++`

Und da kannst du bei Add die nötigen Compiler-Argumente angeben, darunter dann auch die Include-Verzeichnisse mit -Iverzeichns, entsprechend dem Kommandozeilenparameter für den Compiler. Remove: und Compiler: kannst du weglassen. Also in deinem Fall z.B.

1
CompileFlags:
2
  Add: [ -I/path/to/avr/io.h,
3
         -I/usr/lib/avr/include/avr/io.h,
4
         -I/usr/lib/avr/include/avr/,
5
         -I/usr/lib/avr
6
       ]
#7352849
Lesenswert?

säurehaltigerStein schrieb:

Dgi schrieb:

In Visual Studio Code kannst du das Include-Verzeichnis auch in der "c_cpp_properties.json"-Datei definieren, die sich im .vscode-Ordner

Das war schon nicht verkehrt was chatgpt da gebrabbelt hat. Es geht aber bequemer mit cmake und der cmake Extension, dann kann man sich die includes und defines sparen. Cmake wird dann als configurationProvider angegeben.

Igendwie geht das immer noch nicht. Ich weiß auch gar nicht was mti "name": "linux-gcc-x64", gemeint ist. Den benutz ich doch gar nicht.. Ich werde dort mal avr-gcc

name ist beliebig und benennt nur die Intellisense Config die rechts unten im Status angezeigt wird.

https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference

Über den config provider bekommt intellisense dann auch den Compiler und die System includes mit. Durch den Cache sind die Änderungen aber nicht immer sofort wirksam.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren