I am using CMake to configure SDL2 include directories for my project. Configuration is done with this FindSDL2.cmake. Unfortunately with the latest version of SDL (2.14) I get an error: ‘SDL2/SDL_main.h’ file not found. I noticed, that ‘SDL2/’ was added to the include path in SDL.h. I don’t know how to fix this problem.
Can anyone help making this work again?
Where did you download SDL2 from ? Currently, the latest version is 2.24.0 but if you’re using a fixed-point linux distribution, you may be behind (e.g. Ubuntu 22.04 has SDL 2.0.20, Debian Bullseye has SDL 2.0.14).
From what I’m seeing, even the stable debian package ships with the cmake config files and shouldn’t require you to use a custom FindSDL2. Could you try without it to see if it works ?
I’m very sorry! This was a typo. I meant the latest version 2.24.0. I am on macOS (also latest version).
Yes, I have seen this issue around that using a 3rd party
FindSDL2 package along the latest release breaks.
You should be able to just do this, without having to import any additional file:
add_executable(myExe <your sources>)
find_package(SDL2 CONFIG REQUIRED)
target_link_libraries(myExe SDL2::SDL2) # If you target a platform that needs SDL2main, add SDL2::SDL2main
My problem still persists and I am unable to use SDL2 2.24.0. Does anyone have an idea how this can be fixed?
Creating a link inside the Headers directory (ln -s . ./SDL2) seems to fix the problem with finding the headers, but breaks code signature so that I still can’t use SDL2 v2.24.0.
Sorry for the late reply. I just got time to look deeper into it.
It’s a pretty complicated issue due to how Apple forces framework includes to prepend the name of the framework even if it doesn’t represent the real path on disk. In our case:
- The real path is
- While Apple requires the include to be
CMake is usually smart about that and passes the framework with
-isystem /Library/Frameworks/SDL2.framework to the compiler, which solves that issue.
When looking closer at your project, I noticed the following issues:
- Pretty much all source files include
main.h which in turn includes
- All the sub libraries (e.g. SoftFloat, Debug, Slirp) are not linking to SDL2 (even the one named
GuiSdl oddly enough)
From manual testing, I have noticed that CMake will only emit an
-isystem flag if the target links against SDL2, only setting the include directory will make it emit a
-I flag that will fail to find the other SDL2 headers.
So here are the steps I took to get to compile using the framework release of SDL 2.24.0:
FindSDL2.cmake, this is no longer needed and will conflict with the files shipped with SDL2 releases.
- For every target created with
add_library, follow with a
target_link_libraries(My_Target PRIVATE SDL2::SDL2)
I also noticed here that you were using
SDL2_LIBRARY, this is not provided by the official CMake configuration. You may want to use the target
SDL2::SDL2 instead, it’s provided by config files even on the Debian stable SDL2 package!
There is also the
SDL2_LIBRARIES variable, but be mindful that it may also contain
SDL2::SDL2main when the target exists.
From testing, this change is also compatible when using Homebrew-packaged SDL2 if that’s a concern
I hope this clears up the issue and how to solve it!
thank you very much for the help! It seems this (https://sourceforge.net/p/previous/code/1161/) patch fixes my issues. Maybe I should check if really all libraries require SDL2 to work, but at least it compiles now.
I think this should also work on other platforms like Windows of Linux? I am not able to test. Would this also work with earlier versions of SDL2?
There occured another problem related to the inital one. After releasing my application without FindSDL2.cmake it broke custom building for some people. The problem occurs if multiple instances of SDL2 are present. Before people used setenv SDL2DIR to select which one to compile against. This no longer works.
Is there a way to make this work again?