Resolve WinMain linking issues with CMake

This commit is contained in:
Cameron Cawley 2021-07-05 16:35:43 +01:00
parent b1781f4189
commit 77753c8539
6 changed files with 34 additions and 14 deletions

View File

@ -1,22 +1,21 @@
find_package(PkgConfig QUIET) # On Windows, SDL2main is included as part of the pkg-config output, which isn't desirable when linking.
if(PKG_CONFIG_FOUND) if(NOT WIN32)
pkg_check_modules(SDL2 IMPORTED_TARGET "sdl2") find_package(PkgConfig QUIET)
if(TARGET PkgConfig::SDL2 AND NOT TARGET SDL2::SDL2) if(PKG_CONFIG_FOUND)
add_library(SDL2::SDL2 INTERFACE IMPORTED) pkg_check_modules(SDL2 IMPORTED_TARGET "sdl2")
set_property(TARGET SDL2::SDL2 PROPERTY INTERFACE_LINK_LIBRARIES PkgConfig::SDL2) if(TARGET PkgConfig::SDL2 AND NOT TARGET SDL2::SDL2)
add_library(SDL2::SDL2 INTERFACE IMPORTED)
set_property(TARGET SDL2::SDL2 PROPERTY INTERFACE_LINK_LIBRARIES PkgConfig::SDL2)
endif()
endif() endif()
endif() endif()
find_library(SDL2main_LIBRARY SDL2main)
if(NOT SDL2_FOUND) if(NOT SDL2_FOUND)
find_path(SDL2_INCLUDE_DIR sdl2.h) find_path(SDL2_INCLUDE_DIR SDL.h PATH_SUFFIXES SDL2)
find_library(SDL2_LIBRARY SDL2 SDL2d) find_library(SDL2_LIBRARY SDL2 SDL2d)
find_library(SDL2main_LIBRARY SDL2main)
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(libuv find_package_handle_standard_args(SDL2
REQUIRED_VARS SDL2_INCLUDE_DIR SDL2_LIBRARY REQUIRED_VARS SDL2_INCLUDE_DIR SDL2_LIBRARY
) )
@ -29,6 +28,8 @@ if(NOT SDL2_FOUND)
endif() endif()
endif() endif()
find_library(SDL2main_LIBRARY SDL2main)
if(SDL2main_LIBRARY AND NOT TARGET SDL2::SDL2main) if(SDL2main_LIBRARY AND NOT TARGET SDL2::SDL2main)
add_library(SDL2::SDL2main UNKNOWN IMPORTED) add_library(SDL2::SDL2main UNKNOWN IMPORTED)
set_target_properties(SDL2::SDL2main PROPERTIES set_target_properties(SDL2::SDL2main PROPERTIES

View File

@ -19,7 +19,6 @@ add_library(librw_skeleton
imgui/stb_textedit.h imgui/stb_textedit.h
imgui/stb_truetype.h imgui/stb_truetype.h
) )
add_library(librw::skeleton ALIAS librw_skeleton)
set_target_properties(librw_skeleton set_target_properties(librw_skeleton
PROPERTIES PROPERTIES
@ -38,6 +37,20 @@ target_include_directories(librw_skeleton
$<INSTALL_INTERFACE:${LIBRW_INSTALL_INCLUDEDIR}/skeleton> $<INSTALL_INTERFACE:${LIBRW_INSTALL_INCLUDEDIR}/skeleton>
) )
# HACK: When building with MinGW, it's necessary to link to libmingw32.a *before* the library
# that provides WinMain. To work around this, an intermediate target is created when using MinGW
# that specifies the correct linking order.
#
# TODO: Use SDL_main on platforms that require it
if(MINGW AND LIBRW_PLATFORM_D3D9)
add_library(librw_skeleton_main INTERFACE)
find_library(MINGW32_LIBRARY NAMES mingw32)
target_link_libraries(librw_skeleton_main INTERFACE ${MINGW32_LIBRARY} librw_skeleton)
add_library(librw::skeleton ALIAS librw_skeleton_main)
else()
add_library(librw::skeleton ALIAS librw_skeleton)
endif()
if(LIBRW_INSTALL) if(LIBRW_INSTALL)
install( install(
FILES FILES

View File

@ -1,5 +1,8 @@
#ifdef LIBRW_SDL2 #ifdef LIBRW_SDL2
#ifdef _WIN32
#define SDL_MAIN_HANDLED
#endif
#include <rw.h> #include <rw.h>
#include "skeleton.h" #include "skeleton.h"

View File

@ -1,4 +1,5 @@
#ifdef _WIN32 #ifdef _WIN32
#define SDL_MAIN_HANDLED
#include <windows.h> #include <windows.h>
#include <rw.h> #include <rw.h>
#include "skeleton.h" #include "skeleton.h"
@ -291,7 +292,7 @@ SetMousePosition(int x, int y)
#endif #endif
#ifdef RW_OPENGL #if defined(RW_OPENGL) && !defined(__MINGW32__)
int main(int argc, char *argv[]); int main(int argc, char *argv[]);
int WINAPI int WINAPI

View File

@ -3,6 +3,7 @@
#include <cstring> #include <cstring>
#include <cassert> #include <cassert>
#define SDL_MAIN_HANDLED
#include <rw.h> #include <rw.h>
using namespace std; using namespace std;

View File

@ -3,6 +3,7 @@
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#define SDL_MAIN_HANDLED
#include <rw.h> #include <rw.h>
#include <args.h> #include <args.h>