Portierung von Linux auf Windows
-
Hallo,
Ich habe ein kleines 3D Tic Tac Toe geschrieben, das unter Linux wunderbar funktioniert. Jetzt möchte ich es nach Windows portieren.
Ich habe mir dafür MinGW und MSYS auf einen Windowsrechner gezogen, sodass ich in der Konsole das aus dem Linuxprojekt stammende makefile benutzen kann.
Problem: Ich nutze unter anderem SDL2. Es befindet sich die SDL2.dll Datei im selben Ordner wie die EXE. Er zeigt mir dennoch ein "undefined reference" auf jede SDL Funktion. Scheinbar linke ich falsch.
Hier ist das makefile:
VERSION = 1.00 CFLAGS = -Wall -Wpedantic -Wextra -std=gnu++11 # ---------------------------------------------- # ENGINE # ---------------------------------------------- # SRC --> ENGINE ES001 = code/src/en_app.cpp ES002 = code/src/en_shader.cpp ES003 = code/src/en_file.cpp ES004 = code/src/en_3d_mdl.cpp ES005 = code/src/en_string.cpp ES006 = code/src/en_math.cpp ES007 = code/src/en_light.cpp ES009 = code/src/en_2d_mdl.cpp ES010 = code/src/en_app_3d_mdl.cpp ES011 = code/src/en_app_2d_mdl.cpp ES012 = code/src/en_app_text.cpp ES013 = code/src/en_app_light.cpp ES015 = code/src/en_app_sound.cpp ES016 = code/src/en_app_automat.cpp # HEADER --> ENGINE EH001 = code/incl/en_app.h EH002 = code/incl/en_shader.h EH003 = code/incl/en_file.h EH004 = code/incl/en_3d_mdl.h EH005 = code/incl/en_glb.h EH006 = code/incl/en_error.h EH007 = code/incl/en_string.h EH008 = code/incl/en_light.h EH009 = code/incl/en_math.h EH011 = code/incl/en_2d_mdl.h EH013 = code/incl/en_structs.h # ---------------------------------------------- # GAME # ---------------------------------------------- # SRC --> GAME GS001 = code/src/gm_main.cpp GS002 = code/src/gm_run.cpp GS005 = code/src/gm_update.cpp # HEADER --> GAME GH015 = code/incl/gm_error.h GH001 = code/incl/gm_main.h GH002 = code/incl/gm_run.h GH003 = code/incl/gm_glb.h GH006 = code/incl/gm_update.h GH008 = code/incl/gm_state.h GH009 = code/incl/gm_res.h # ---------------------------------------------- # COMPILE # ---------------------------------------------- E_SRC = $(ES001) $(ES002) $(ES003) $(ES004) $(ES005) $(ES006) $(ES007) $(ES009) $(ES010) $(ES011) $(ES012) $(ES013) $(ES015) $(ES016) G_SRC = $(GS001) $(GS002) $(GS005) E_HEAD = $(EH001) $(EH002) $(EH003) $(EH004) $(EH005) $(EH006) $(EH007) $(EH008) $(EH009) $(EH011) $(EH013) G_HEAD = $(GH001) $(GH002) $(GH003) $(GH006) $(GH008) $(GH009) #SDL = -lSDL2 #OGL = -lGL -lGLEW -lSOIL #LIBRARY = $(SDL) OUT = -o tic_tac_toe tic_tac_toe: $(E_SRC) $(G_SRC) $(E_HEAD) $(G_HEAD) g++ $(CFLAGS) $(E_SRC) $(G_SRC) $(OUT) -I"irrklang/include"
Momentan sind die Verweise auskommentiert. Ich habe aber schon alles probiert. Ich habe auch versucht statisch die passenden .a Dateien zu linken. Ohne Erfolg.
Ich bekomme immer die selbe Fehlermeldung. (es funktioniert bisher kein Verweis auf eine Bibliothek, aber das Problem ist ja analog zur SDL2 Bibliothek)Wie linke ich also die SDL2 Bibliothek korrekt?
-
Ich sehe nicht dass SDL hier überhaupt gelinkt wird. Selbst wenn das entsprechende Linker-Flag in Zeile 70 nicht auskommentiert wäre, so kommt es in der Kommandozeile in Zeile 76 nicht vor.
Ich würde zunächst einmal sicherstellen, dass das Programm mit "-lSDL2" gebaut wird, und die Datei "libSDL2.a" im Suchpfad des Linkers existiert.Gruss,
Finnegan
-
Hey,
Ja das hatte ich nur vergessen zu posten. Es gibt in meinem Projektordner nun einen "lib" Ordner wo die Dateien libSDL2.a und libSDL2main.a drin sind.
Das makefile sieht nun wie folgt aus:
VERSION = 1.00 CFLAGS = -Wall -Wpedantic -Wextra -std=gnu++11 # ---------------------------------------------- # ENGINE # ---------------------------------------------- # SRC --> ENGINE ES001 = code/src/en_app.cpp ES002 = code/src/en_shader.cpp ES003 = code/src/en_file.cpp ES004 = code/src/en_3d_mdl.cpp ES005 = code/src/en_string.cpp ES006 = code/src/en_math.cpp ES007 = code/src/en_light.cpp ES009 = code/src/en_2d_mdl.cpp ES010 = code/src/en_app_3d_mdl.cpp ES011 = code/src/en_app_2d_mdl.cpp ES012 = code/src/en_app_text.cpp ES013 = code/src/en_app_light.cpp ES015 = code/src/en_app_sound.cpp ES016 = code/src/en_app_automat.cpp # HEADER --> ENGINE EH001 = code/incl/en_app.h EH002 = code/incl/en_shader.h EH003 = code/incl/en_file.h EH004 = code/incl/en_3d_mdl.h EH005 = code/incl/en_glb.h EH006 = code/incl/en_error.h EH007 = code/incl/en_string.h EH008 = code/incl/en_light.h EH009 = code/incl/en_math.h EH011 = code/incl/en_2d_mdl.h EH013 = code/incl/en_structs.h # ---------------------------------------------- # GAME # ---------------------------------------------- # SRC --> GAME GS001 = code/src/gm_main.cpp GS002 = code/src/gm_run.cpp GS005 = code/src/gm_update.cpp # HEADER --> GAME GH015 = code/incl/gm_error.h GH001 = code/incl/gm_main.h GH002 = code/incl/gm_run.h GH003 = code/incl/gm_glb.h GH006 = code/incl/gm_update.h GH008 = code/incl/gm_state.h GH009 = code/incl/gm_res.h # ---------------------------------------------- # COMPILE # ---------------------------------------------- E_SRC = $(ES001) $(ES002) $(ES003) $(ES004) $(ES005) $(ES006) $(ES007) $(ES009) $(ES010) $(ES011) $(ES012) $(ES013) $(ES015) $(ES016) G_SRC = $(GS001) $(GS002) $(GS005) E_HEAD = $(EH001) $(EH002) $(EH003) $(EH004) $(EH005) $(EH006) $(EH007) $(EH008) $(EH009) $(EH011) $(EH013) G_HEAD = $(GH001) $(GH002) $(GH003) $(GH006) $(GH008) $(GH009) #SDL = -lSDL2 #OGL = -lGL -lGLEW -lSOIL #LIBRARY = $(SDL) OUT = -o tic_tac_toe tic_tac_toe: $(E_SRC) $(G_SRC) $(E_HEAD) $(G_HEAD) g++ $(CFLAGS) $(E_SRC) $(G_SRC) $(OUT) -I"irrklang/include" -L lib/ -lSDL2 -lSDL2main
Die SDL2.dll befindet sich im Projektordnerverzeichnis, wo die .exe erzeugt werden soll.
Ich erhalte beim Kompilieren folgende Fehlermeldung:g++ -Wall -Wpedantic -Wextra -std=gnu++11 code/src/en_app.cpp code/src/en_shader .cpp code/src/en_file.cpp code/src/en_3d_mdl.cpp code/src/en_string.cpp code/src /en_math.cpp code/src/en_light.cpp code/src/en_2d_mdl.cpp code/src/en_app_3d_mdl .cpp code/src/en_app_2d_mdl.cpp code/src/en_app_text.cpp code/src/en_app_light.c pp code/src/en_app_sound.cpp code/src/en_app_automat.cpp code/src/gm_main.cpp co de/src/gm_run.cpp code/src/gm_update.cpp -o tic_tac_toe -I"irrklang/include" -L lib/ -lSDL2 -lSDL2main C:\Users\Dycon\AppData\Local\Temp\ccubRWme.o:en_app.cpp:(.text+0x92b): undefined reference to `SDL_GL_SetAttribute' C:\Users\Dycon\AppData\Local\Temp\ccubRWme.o:en_app.cpp:(.text+0x94c): undefined reference to `SDL_GL_SetAttribute' C:\Users\Dycon\AppData\Local\Temp\ccubRWme.o:en_app.cpp:(.text+0x96d): undefined reference to `SDL_GL_SetAttribute' ...
Das ist nur ein kleiner Auszug.. ich erhalte hunderte Zeilen mit undefined reference auf jede SDL Funktion, die ich benutze. Was fehlt? was mache ich falsch?
-
Ich kann hier nur raten, da ich selbst noch nicht mit SDL gearbeitet habe: Bist du sicher, dass die Reihenfolge der gelinkten Bibliotheken richtig ist? Wenn z.B. SDLmain die aufgelisteten Symbole als Abhängigkeiten hat, dann könnte das dennoch zu soclhen Fehlermeldungen führen, obwohl alle Bibliotheken gelinkt wurde. Versuch es mal mit "-lSDL2main -lSDL2". Falls das auch nicht hilft gehen mir auch erstmal die Ideen aus. Es sei denn es gibt noch andere .a-Dateien die zu SDL gehören und die dir in deinem Projekt fehlen.
Gruss,
Finnegan
-
Hey,
Ich habe das mal probiert. Das bringt leider auch nichts. Also erst lSDL2main gelinkt und dann lSDL2. Es ändert sich nichts an der Fehlerausgabe. Ich habe auch nachgelesen lSDL2 muss vor lSDL2main gelinkt werden. Das ist also eigentlich auch korrekt. Ich habe das ganze Windowsprojekt mal hochgeladen als .zip Ordner.
wp1105995.server-he.de/tictactoe3D.zip
(Dass OpenGL auch noch gelinkt werden muss, ist mir klar, aber ich wollte erst einmal mit SDL anfangen, um die Fehlerausgabe zu minimieren)
Sollte über die Kommandozeile im Ordner mit dem Makefile auch mit "make" aufrufbar sein.
Gruß,
PadMad
-
Huhu,
Ich habe irgendwo in den tiefen Weiten des WWW gelesen, dass .a Dateien für Unix basierte Systeme sind, und .lib für Windows (?). Mit den .lib Dateien geht es dann!
Obwohl ich immer dachte, Windows sei auch Unix basiert... egal. Es funktioniert jetzt schon mal mit SDL. Vielen Dank!
-
Hi! Möglichwerweise enthalten die .a-Dateien die du da hast, nicht den Code für das richtige System. Eventuell sind die tatsächlich für Linux.
Das heisst aber nicht, dass .a-Dateien generell für Linux sind!
.a ist ein Archiv-Format (sowas wie ZIP) für statische Bibliotheken, das z.B. GCC (oder auch Clang) verwendet wird.
Das .lib-Format ist intern ähnlich, wird aber vornehmlich von MSVC-Compilern verwendet. Es ist gut möglich, dass GCC unter Windows auch das .lib-Format unterstützt und die .a-Bibliotheken in deinem Projekt Linux-Code enthalten. Das würde sich zumindest mit deinen Beobachtungen decken.Gruss,
Finnegan