SDL Includes für Vulkan Projekt
-
Hi,
wollte gerade meine ersten Vulkan experimente Starten, leider fehlt mir der C++ Background. Auf youtube gibt es dieses Video nach dem ich mich gerichtet habe: https://www.youtube.com/watch?v=N-ucDRvW56E&list=PLStQc0GqppuXgs6do23v_HKRrR32gJMm3&index=2
Beim Erstellen des Projektes in VS2022 erscheint dieser Fehler:
E1696 Die Datei "Quelle" kann nicht geöffnet werden: "SDL.h". vulkan_tutorial X:\development\code\vulkan\tmp\VulkanTutorial\src\main.cpp 2
in VS steht unter zusätzliche Include Verzeichnisse:
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include
Auf der Festplatte gibt es:
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3\SDL.h
in der main.cpp steht:
#include <SDL.h>
Sieht so aus als hätten die SDL Entwickler das Verzeichnis SDL3 bei einem Versionsupgrade mit eingefügt, nachdem der Youtube Ersteller das Video erstellt hat. Also in der main.cpp geädert:
#include <SDl3/SDL.h>
Neuer Fehler:
E1696 Die Datei "Quelle" kann nicht geöffnet werden: "SDL_vulkan.h". vulkan_tutorial X:\development\code\vulkan\tmp\VulkanTutorial\src\main.cpp 3
Neue Anpassung in der main.cpp
#include <SDL3/SDL_vulkan.h>
Dann kommen noch ein paar andere Fehler, irgendwas mit stb, das muss wohl noch per submodule hinzugefügt werden.
Aber dann geht es weiter mit:C1083 Datei (Include) kann nicht geöffnet werden: "SDL.h": No such file or directory vulkan_tutorial X:\development\code\vulkan\tmp\VulkanTutorial\libs\imgui\backends\imgui_impl_sdl.cpp 70
Also wieder SDL.h nicht gefunden.
Wie binde ich die denn richtig ein? Es kann doch nicht sein das der Nutzer in anderen Libraries die Pfade anpassen muss.Wenn man den Include Pfad von
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include
auf diesen hier ändert:
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3
und in der main.cpp die zwei SDL3 Änderungen wieder zurücknimmt, dann ist das SDL Library unglücklich:
E1696 Die Datei "Quelle" kann nicht geöffnet werden: "SDL3/SDL_stdinc.h". vulkan_tutorial X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3\SDL.h 32
Gebaut wurde das Projekt mit:
https://github.com/Pilzschaf/VulkanTutorial/blob/main/CMakeLists.txtWo liegt der Fehler?
-
@newuser49 sagte in SDL Includes für Vulkan Projekt:
wollte gerade meine ersten Vulkan experimente Starten, leider fehlt mir der C++ Background.
Zumindest robuste C++-Grundlagen sind schon zu empfehlen, bevor du mit einer solchen API anfängst, sonst wirst du vermutlich noch über viel mehr Dinge stolpern als lediglich korrekte Include-Verzeichnisse. Auch besteht die Gefahr, dass du dir unsauberes C++ angewöhnst, da gerade C-Bibliotheken (wie Vulkan auch eine ist) öfter mal C++-Konstrukte erfordern, die eben C-typisch und nicht idiomatisches, modernes C++ sind.
Sieht so aus als hätten die SDL Entwickler das Verzeichnis SDL3 bei einem Versionsupgrade mit eingefügt, nachdem der Youtube Ersteller das Video erstellt hat. Also in der main.cpp geädert:
#include <SDl3/SDL.h>
Neuer Fehler:
[...]Ich empfehle generell die Include-Verzeichnisse so zu setzen, wie sie das externe Projekt haben will und nicht dessen Sourcen anzupassen. Erstens erfordert das, wie du ja selbst siehst, selbst bei kleinen Projekten schon verdammt viele Anpassungen und zweitens erschwert es, bei Bedarf auf eine neue Version zu wechseln, da man dann die Anpassungen erneut machen muss, wenn man das nicht separat als eigenen Fork pflegen will.
Du solltest also stattdessen
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3
als Include-Verzeichnis setzen. Oder auch als zusätzliches Verzeichnis zu dem, was du bereits eingetragen hast, falls du anderen Code hast, der via
<SDL3/...>
einbindet. Wenn ich mich allerdings recht entsinne, dann machen die meisten SDL-Projekte, die ich im Laufe der Zeit gesehen habe, ein simples#include <SDL.h>
.
-
Das klingt jetzt ziemlich nach Hack und ist es auch, aber könntest du nicht beides als Pfad angeben?
-
@Finnegan sagte in SDL Includes für Vulkan Projekt:
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3
Bei Angabe von SDL3 am Ende kommt das hier:
E1696 Die Datei "Quelle" kann nicht geöffnet werden: "SDL3/SDL_stdinc.h". vulkan_tutorial X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3\SDL.h 32
Was allerdings nicht stimmt da diese Datei existiert, Shift+Rechtsklick -> Pfad kopieren
"X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3\SDL.h"
Wenn man allerdings wie vorgeschlagen beides angibt funktioniert es. Das wollte ich gar nicht vorschlagen, das klang mir auch zu hacky
-
@newuser49 sagte in SDL Includes für Vulkan Projekt:
@Finnegan sagte in SDL Includes für Vulkan Projekt:
X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3
Bei Angabe von SDL3 am Ende kommt das hier:
E1696 Die Datei "Quelle" kann nicht geöffnet werden: "SDL3/SDL_stdinc.h". vulkan_tutorial X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3\SDL.h 32
Was allerdings nicht stimmt da diese Datei existiert, Shift+Rechtsklick -> Pfad kopieren
"X:\development\code\vulkan\tmp\VulkanTutorial\libs\SDL\include\SDL3\SDL.h"
SDL selbst scheint über
<SDL3/...>
einzubinden und das Tutorial ohne Unterverzeichnis. Ich habe schon viele Bibliotheken mit endlos langen rekursiven Abhängigkeiten in Projekte eingebunden und kann dir sagen, dass sowas echt häufiger vorkommt. Es spricht für deine Einstellung zum Programmieren, wenn dir das nicht gefällt, aber gewöhn dich daran, das ist immer noch besser als das externe Projekt irgendwie anfassen und patchen zu müssen. Bei größeren Projekten wirst du froh um jede Bibliothek sein, die du unmodifiziert in dein eigenes Projekt einbinden kannst - eben weil alle Änderungen, die du machst auch von dir für spätere Versionen weiter gepflegt werden müssen.Und ja, ich finde es auch etwas unsauber, beide Verzeichnisse in den Includes anzugeben, aber das sind Hacks, die man öfter machen muss, da würd ich mir keinen Kopf drum machen. Du glaubst nicht, was die Build-Systeme verschiedenster Projekte alles für "Hacks" dieser Art enthalten. Ist völlig normal. Wenn ich da an diverse Build-Skripte z.B. von Paketen für irgenwelche Linux-Distributionen denke, dann ist so ein doppeltes Include-Verzeichnis noch ziemlich harmlos. Ich selbst habe auch schon übleres Zeug in Build-Skripten gemacht - den unmodifizierten Quellcode des externen Projekts verwenden zu können ist einfach wichtiger IMHO.
Edit: Ich habe mir mal die
CMakeLists.txt
des Vulkan Tutorials angesehen, und dort wird SDL2 referenziert, z.B. hier:# Find SDL2 add_subdirectory(libs/SDL)
Ich halte es für möglich, dass das Include via
<SDL3/...>
eventuell deshalb von den SDL-Entwicklern eingeführt wurde, damit man beide SDL-Version parallel installiert haben kann, ohne dass die sich gegenseitig in die Quere kommen. Möglicherweise bedeutet#include <SDL.h>
, dass man SDL2 und#include <SDL3/SDL.h>
dass man SDL3 verwenden möchte.Du solltest sicherstellen, dass das Tutorial auch mit SDL3 funktioniert und nicht aus irgendeinem Grund SDL2 benötigt. Gut möglich, dass das mit dem doppelten Include einfach so funktioniert, im Zweifelsfall solltest du aber überlegen vielleicht stattdessen SDL2 zu verwenden.