неопределенная ссылка на ошибку WinMain@16 при связывании SDL1.2 в cmake для MinGW - PullRequest
0 голосов
/ 31 марта 2020

Мне недавно удалось найти решение этой проблемы, связанной с SDL2, но каким-то образом эти решения не относятся к SDL1.2. Я попытался использовать флаги -lmingw32 -lSDL -lSDLmain, а также добавить add_definitions(-DSDL_MAIN_HANDLED) в конец файла CMakeLists.txt. Однако я все еще получаю следующее сообщение об ошибке:

====================[ Build | Graphics_project | Debug ]========================
"A:\CLion 2019.2.5\bin\cmake\win\bin\cmake.exe" --build D:\Coding\Projects\Graphics_project\cmake-build-debug --target Graphics_project -- -j 4
[ 50%] Linking CXX executable Graphics_project.exe
D:/Coding/MSYS2/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/bin/ld.exe: D:/Coding/MSYS2/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o): in function `main':
D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [Graphics_project.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/Graphics_project.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/Graphics_project.dir/rule] Error 2
CMakeFiles\Graphics_project.dir\build.make:85: recipe for target 'Graphics_project.exe' failed
CMakeFiles\Makefile2:74: recipe for target 'CMakeFiles/Graphics_project.dir/all' failed
CMakeFiles\Makefile2:81: recipe for target 'CMakeFiles/Graphics_project.dir/rule' failed
Makefile:117: recipe for target 'Graphics_project' failed
mingw32-make.exe: *** [Graphics_project] Error 2

Вот мой контент CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(Graphics_project)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

find_package(SDL REQUIRED)
include_directories(${SDL_INCLUDE_DIR})

add_executable(Graphics_project main.cpp)

target_link_libraries(${PROJECT_NAME} ${SDL_LIBRARY})
add_definitions(-DSDL_MAIN_HANDLED)

И в отдельной папке cmake в папке проекта у меня есть FindSDL.cmake file:

set(FIND_SDL_PATHS D:/Coding/Devs/SDL-devel-1.2.15-mingw32/SDL-1.2.15)

find_path(SDL_INCLUDE_DIR SDL
        PATH_SUFFIXES include
        PATHS ${FIND_SDL_PATHS})

find_library(SDL_LIBRARY
        NAMES SDL SDLmain
        PATH_SUFFIXES lib
        PATHS ${FIND_SDL_PATHS})

Я пытаюсь скомпилировать простой "Hello World":

#include <iostream>
#include "SDL/SDL.h"

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
} 

Буду признателен за помощь, я просто не понимаю, как это это отличается от связывания библиотеки SDL2.

1 Ответ

0 голосов
/ 03 апреля 2020

Вам не хватает опции WIN32 в add_executable().

add_executable(Graphics_project WIN32 main.cpp)

Одна из особенностей Windows состоит в том, что GUI приложения (не консольные приложения) заменяют точку входа ( первая функция, которая вызывается, обычно main()) вашей программы с помощью WinMain(), которая в свою очередь вызывает функцию main() после некоторой настройки. Переключатель WIN32 обеспечивает генерирование этой функции.

...