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


Anmelden zum Antworten