Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.03.2008, 14:32

SDL-Projekt mit MinGw übersetzen?

Hallo,

habe versucht, die Sourcen von "Ein Spiel mit der SDL" aus Heiko Kallistas Buch "C++ für Spieleprogrammierer" mit Mingw unter Windows (2000) zu übersetzen. Ich habe mir dazu folgendes Makefile geschrieben:




Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Makefile to build the sdl game from "C++ für Spielprogrammierer"
#

CC = mingw32-c++.exe 
CCFLAGS = -IC:\Spieleprogrammierung\SDL-1.2.8\include -LC:\Spieleprogrammierung\SDL-1.2.8\lib 

OBJS = Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o
TARGET = sdlgame.exe

.cpp.o: 
    $(CC)  $(CCFLAGS) -c $*.cpp


$(TARGET): $(OBJS)
    $(CC) $(CCFLAGS) $(OBJS) -o sdlgame.exe -lmingw32 -lSDLmain -lSDL -mwindows


Wenn ich das dann mit mingw32-make aufrufe, werden die Object-Files korrekt erzeugt, allerdings klappt das Linken nicht; ich kriege folgenden Output:

Quellcode

1
2
3
4
5
6
7
8
9
10
|| mingw32-c++.exe  -IC:\Spieleprogrammierung\SDL-1.2.8\include -LC:\Spieleprogrammierung\SDL-1.2.8\lib  Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o -o sdlgame.exe -lmingw32 -lSDLmain -lSDL -mwindows 
|| C:\Spieleprogrammierung\SDL-1.2.8\lib/SDLmain.lib(./Release/SDL_win32_main.obj):C:\public_cvs\SDL-:(.text[_main]+0x0): multiple definition of `main'

|| /mingw/lib/libmingw32.a(main.o):main.c:(.text+0x0): first defined here
|| Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"MSVCRT" /DEFAULTLIB:"OLDNAMES" ' unrecognized
|| C:\Spieleprogrammierung\SDL-1.2.8\lib/SDLmain.lib(./Release/SDL_win32_main.obj):C:\public_cvs\SDL-:(.text[_main]+0x55): undefined reference to `_alloca_probe'
|| C:\Spieleprogrammierung\SDL-1.2.8\lib/SDLmain.lib(./Release/SDL_win32_main.obj):C:\public_cvs\SDL-:(.text[_WinMain@16]+0x162): undefined reference to `_alloca_probe'
|| C:\Spieleprogrammierung\SDL-1.2.8\lib/SDLmain.lib(./Release/SDL_win32_main.obj):C:\public_cvs\SDL-:(.text[_WinMain@16]+0x1a5): undefined reference to `_alloca_probe'
|| collect2: ld returned 1 exit status
|| mingw32-make: *** [sdlgame.exe] Error 1



Ich habe mal danach gesucht: demnach soll man dem Compiler zusätzlich die Optionen "-Dmain=SDL_main" und "-winmm" übergeben, um das zu beheben. Ich habe die dann mal eingefügt, allerdings hat das an der Fehlermeldung nichts geändert. Vielleicht muss man die an einer bestimmten Stelle einfügen?

Kann mir jemand da einen Tipp geben, was da schief läuft?

Für jede Hilfe dankbar

Wolfgang

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

2

16.03.2008, 16:07

hau unter mingw die lib SDL_main raus. Dann sollte es funktoniern.

3

16.03.2008, 18:44

Ohne SDL_main geht's noch immer nicht ganz

Hallo fkrauthan,

erstmal vielen Dank, das hilft schon weiter, der Fehleroutput ist viel kleiner, aber... Ich habe also mein Makefile jetzt so umgebaut:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Makefile to build the sdl game from "C++ für Spielprogrammierer"
#

CC = mingw32-c++.exe
CCFLAGS = -IC:\Spieleprogrammierung\SDL-1.2.8\include -LC:\Spieleprogrammierung\SDL-1.2.8\lib

OBJS = Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o
TARGET = sdlgame.exe

.cpp.o:
    $(CC)  $(CCFLAGS) -c $*.cpp

$(TARGET): $(OBJS)
    $(CC) $(CCFLAGS) $(OBJS) -o sdlgame.exe -lmingw32 -lSDL -mwindows 


Jetzt kriege ich aber

Quellcode

1
2
3
4
|| mingw32-c++.exe -IC:\Spieleprogrammierung\SDL-1.2.8\include -LC:\Spieleprogrammierung\SDL-1.2.8\lib Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o -o sdlgame.exe -lmingw32 -lSDL -mwindows 
|| /mingw/lib/libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
|| collect2: ld returned 1 exit status
|| mingw32-make: *** [SDLgame.exe] Error 1


Sieht so aus, als wolle der Linker eine Windows-Anwendung bauen statt einer Konsolenapplikation. Ich dachte, dafür wäre der Schalter -mwindows
da. Oder muss man dem Linker das nochmals extra mitteilen?

Gruss

Wolfgang

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

4

16.03.2008, 20:08

hau mal das -mwindows raus ich glabe das mag er nicht.

5

16.03.2008, 20:46

ohne -mwindows ändert sich nix

Habe jetzt -mwindows 'rausgeworfen :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
CC = mingw32-c++.exe
CCFLAGS = -IC:\Spieleprogrammierung\SDL-1.2.8\include -LC:\Spieleprogrammierung\SDL-1.2.8\lib

OBJS = Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o
TARGET = sdlgame.exe

.cpp.o:
    $(CC)  $(CCFLAGS) -c $*.cpp

$(TARGET): $(OBJS)
    $(CC) $(CCFLAGS) $(OBJS) -o sdlgame.exe -lmingw32 -lSDL


Fehlermeldung ist aber wieder:

Quellcode

1
2
3
4
|| mingw32-c++.exe -IC:\Spieleprogrammierung\SDL-1.2.8\include -LC:\Spieleprogrammierung\SDL-1.2.8\lib Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o -o sdlgame.exe -lmingw32 -lSDL 
|| /mingw/lib/libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
|| collect2: ld returned 1 exit status
|| mingw32-make: *** [sdlgame.exe] Error 1


Sieht so aus, als ob er sich um diese Option (-mwindows) gar nicht kümmert. Weiss jemand, wie man mingw sagt, dass nur eine Konsolen-Anwendung erzeugt werden soll?

Gruss

Wolfgang

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

6

16.03.2008, 21:16

Also wenn dein Code Cross platform sein soll dann mach das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
#ifdef _WIN32
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCMd) {
#else
int main() {
#endif


Und compelire es mit dem jetzigen make file

7

17.03.2008, 20:19

Jetzt geht's

So, jetzt habe ich das endlich kompiliert gekriegt. Wenn ich das richtig verstehe, möchte MinGw, zumindest wenn es unter Windows gegen die SDL linken soll, immer eine Windows-Anwendung erstellen. Wie auch immer, jetzt funktioniert's ja.

Vielen vielen Dank nochmal für die (ausdauernde) Hilfe

Wolfgang

fkrauthan

Supermoderator

Beiträge: 979

Wohnort: Vancouver

Beruf: Software engineer

  • Private Nachricht senden

8

17.03.2008, 20:36

Kein Problem. Tu ich doch gerne. Darf man fragen was du gerade proggst für sein Spiel?

9

17.03.2008, 20:54

Was ich gerade mache ...

also, bisher war ich erstmal damit beschäftigt, das Spiel überhaupt zum Laufen zu bringen, was ich mit Deiner Hilfe jetzt ja geschafft habe. Da ich *sehr* alte Hardware benutze, brauchte ich eine entsprechend kleine Entwicklungsumgebung, die eben auch frei sein sollte. Ausprobiert habe ich OpenWatcom und MinGw. OpenWatcom hat bei Heikos Spiel leider das Problem, dass er anscheinend die STL nicht so richtig unterstützt (paar couts durch printfs zu ersetzen, traue ich mir ja gerade noch zu, aber wenn der Compiler an einem der Listentemplates rummäkelt, wird mir das dann schnell zu hoch).

Naja, der Plan ist, das Spiel jetzt nach und nach weiter auszubauen. Als nächstes will ich erstmal einen Punktezähler einbauen, wahrscheinlich nach rechts oben, und für jeden getroffenen Asteroiden gibt's dann halt 10 Punkte mehr. Dann wahrscheinlich noch eine Behandlung für eine Kollision mit dem Spielerraumschiff, und wenn ich das alles higekriegt haben sollte, schaue ich mir mal den Sound an. Als erstes vor allem anderen werde ich aber wohl erstmal ein Logging einbauen ...

Werbeanzeige