2013-09-07 15 views
14

chcę skompilować ten kod:SDL2: LNK1561: punktem wyjścia musi być zdefiniowany

#include <SDL.h> 

int main(int argc, char* argv[]) { 
    return 0; 
} 

Ale to nie może być powiązane: Error 1 error LNK1561: entry point must be defined

Jest jakiś dziwny kod w tej bibliotece: http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h

#define main SDL_main 

Dodałem również SDL2.lib;SDL2main.lib do Ustawienia projektu => Łącznik => Wejście.

Co mogę zrobić, aby uruchomić ten projekt?
VS 2012 SP3, pusty projekt C++.

+2

możliwe duplikat [Dlaczego SDL definiuje główny makro?] (Http: // stackoverflow.com/questions/11976084/why-sdl-defines-main-macro) –

+0

aplikacja konsoli? – 4pie0

+2

@MikeSeymour, nie jest to duplikat: ten wątek nie zawiera odpowiedzi. – DmitryR

Odpowiedz

34

to co znalazłem here:

prawym przyciskiem myszy na nazwę projektu -> Właściwości -> Rozwiń zakładkę Linker -> System -> podsystem: upewnij się, że jest Console (/ podsystem: KONSOLA)

+0

Dodanie tego, jeśli możesz samodzielnie skompilować kompilację int(), upewnij się, że sprawdziłeś ustawienia kompilatora, jak tutaj wspomniano, ponieważ w zależności od tego, w jaki sposób stworzyłeś swój projekt, może to oznaczać, że to ustawienie nie jest dla Ciebie już. Jak było z moim problemem. – ReturnVoid

1

Jako tinky_winki napisał

prawym przyciskiem myszy na nazwę projektu -> Właściwości -> Rozwiń zakładkę Linker -> system -> podsystem: upewnij się, że jest Console (/ podsystem: KONSOLA)

Ale jeśli nie oczekujemy konsolę z oknem po prostu użyć, /podsystem: WINDOWS

2

I odkryli, że ustawienie /podsystem: CONSOLE to tylko połowa rozwiązania. Druga połowa polega na dodaniu SDL_MAIN_HANDLED do dodatkowych definicji. Wskazówka, której użyłem, aby rozwiązać ten problem, można znaleźć pod adresem SDL_main.h. Ustawienie SDL_MAIN_HANDLED mówi plikom nagłówkowym SDL, że już masz funkcję main i nie chcesz, aby zmieniła ona swój własny punkt wejścia.

+0

To jest poprawny sposób na rozwiązanie tego problemu - dobre umiejętności debugowania @dpiron. Jeśli Twój projekt jest poprawnie skonfigurowany, nie powinieneś zmieniać właściwości Linkera na tym etapie. – user3001499

1

NIE#undef main! podczas gdy jest to naprawdę kiepska praktyka na stronie SDL, aby ją na nowo zdefiniować, mają one dobre powody: WinMain jest zdefiniowany po stronie biblioteki i służy do uruchamiania kodu init, pomagając w problemach ze zgodnością. (jeszcze więcej, gdy używasz różnych implementacji SDL, takich jak Steam czy portowanie do innych platform, takich jak Android)

Co zatem należy zrobić? Gdy w systemie Windows, należy zawsze zawierać SDL2main.lib przed SDL2.lib i upewnić się, że główny jest w formacie:

int main(int argc, char* argv[]) // CORRECT 
void main(int argc, char* argv[]) // WRONG 
int main(int, char**) // MAY BE CORRECT 

Źródło: SDL2 Windows FAQ

+0

Również 'int main (int, char **)' jest poprawny. A co z implementacją Steam SDL? Google nie wydaje się o tym wiedzieć. – HolyBlackCat

+1

@HolyBlackCat https://wiki.libsdl.org/Installation#SteamOS SDL udostępnia dynamiczny program ładujący, a wiadomo, że para zawiera własną kopię listy SDL, która jest inna w przypadku SteamOS. –

Powiązane problemy