Forum: Compiler & IDEs clangd pfade hinzufügen für autocomplete


von veganerBauer (Gast)


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 :)

von Rolf M. (rmagnus)


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

: Bearbeitet durch User
von Dgi (Gast)


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"
    }
],

von säurehaltigerStein (Gast)


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.

von DerEinzigeBernd (Gast)


Lesenswert?

Was "dgi" geschrieben hat, klingt wirr. ChatGPT?

von Rolf M. (rmagnus)


Lesenswert?

säurehaltigerStein schrieb:
> Habe auch mal eine .clangd - Datei angelegt..
> mit : /usr/lib/avr/include/avr/

Ist das alles, was in der Datei steht? Die muss eine YAML-Datei sein in 
dem Format, wie in der Doku beschrieben.

: Bearbeitet durch User
von veganerBauer (Gast)


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

von Rolf M. (rmagnus)


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
       ]

: Bearbeitet durch User
von J. S. (jojos)


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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.