F
@Yadgar sagte in Ein- und Ausgabebibliotheken für Grafikformate?:
Ja, ich habe es jetzt gefunden, die Zeile 6 ersetzt durch
#include <stb/stb_image.h>
...und weiß seither, dass sämtliche C-Header standardmäßig in /usr/include liegen, die C++-Bibliotheken in /usr/include/C++/10/! Sehr instruktiv, danke für den Tipp!
Das Wichtige ist nicht /usr/include, da liegen fast alle systemweiten Header, sondern dass das Paket die Header nach /usr/include/stb/ installiert. Compiler auf Linux sind typischerweise so konfiguriert, dass sie standardmäßig /usr/include als eines der Default-Includeverzeichnisse verwenden. Um von diesem aus /usr/include/stb zu erreichen, muss man natürlich im Quellcode einen relativen Pfad stb/stb_image.h angeben. Mit g++ -v ... bekommst du das auch angezeigt. Da gibt GCC dann am Ende z.B. so was aus:
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/16/../../../../include/c++/16
/usr/lib/gcc/x86_64-pc-linux-gnu/16/../../../../include/c++/16/x86_64-pc-linux-gnu
/usr/lib/gcc/x86_64-pc-linux-gnu/16/../../../../include/c++/16/backward
/usr/lib/gcc/x86_64-pc-linux-gnu/16/include
/usr/local/include
/usr/include
End of search list.
Wenn der Compiler also ein relatives #include <stb/stb_image.h> sieht, dann hängt er das an all diese Verzeichnisse an und nimmt das erste, wo er die Datei findet:
/usr/lib/gcc/x86_64-pc-linux-gnu/16/../../../../include/c++/16/stb/stb_image.h
/usr/lib/gcc/x86_64-pc-linux-gnu/16/../../../../include/c++/16/x86_64-pc-linux-gnu/stb/stb_image.h
/usr/lib/gcc/x86_64-pc-linux-gnu/16/../../../../include/c++/16/backward/stb/stb_image.h
/usr/lib/gcc/x86_64-pc-linux-gnu/16/include/stb/stb_image.h
/usr/local/include/stb/stb_image.h
/usr/include/stb/stb_image.h
Und das letzte Verzeichnis ist genau das, wo das libstb-dev-Paket den Header installiert hat.
So am Rande: /usr/include/C++/10 (ich sehe du verwendest GCC 10 ) ist übrigens nicht unbedingt nicht immer das Include-Verzeichnis für die C++-Header. Die werden beim Build von GCC konfiguriert und können z.B. auch relativ zum g++-Program sein, wie bei einer anderen portablen GCC-Toolchain die ich verwende:
/toolchains/dlo-toolchain-x86_64-linux-musl/bin/../lib/gcc/i386-dlo-elf/16.2.0/include/c++
Das passt sich dann immer an das Verzeichnis an, in dem GCC installiert wurde und ermöglicht, den Compiler auch neben dem System-Compiler in einem beliebigen Verzeichnis zu installieren. System-Compiler (also die, die mit der Distribution kommen) sind aber typischerweise für feste, absolute Include-Verzeichnisse wie /usr/include konfiguriert.
Das nur am Rande, falls du in Zukunft noch andere nicht gefundene Header debuggen willst. Schau die am besten an, was gcc -v ... oder g++ -v ... als Include-Verzeichnisse angeben und ob er den Header damit auch finden kann.
Natürlich kannst du auch eigene Suchverzeichnisse hinzufügen. Wenn du z.B. mit
g++ -I/usr/include/stb
kompilierst, dann funktioniert auch #include <stb_image.h>. Lass es aber besser bei #include <stb/stb_image.h>. Das ist portabler, weil es nicht den expliziten Include-Pfade erfordert.