2013-07-12 10 views
10

Ich verwende Windows 7, Code :: Blocks und MinGW. Ich habe wenig oder keine Erfahrung, wenn es darum geht etwas zu kompilieren/zu bauen, besonders wenn Code :: Blocks keine Makefiles benutzt.Statische Verbindung von SDL2-Bibliotheken

Ich habe SDL2-devel-2.0.0-mingw.tar.gz (SDL Development Libraries) von http://www.libsdl.org/tmp/download-2.0.php heruntergeladen, und ich möchte eine eigenständige ausführbare Datei mit SDL2-Bibliotheken erstellen, aber bisher musste ich immer bündeln Sie die SDL2.dll-Datei mit der ausführbaren Datei, damit es funktioniert.

Ich habe gehört, dass ich dynamische Bibliotheken nicht statisch verbinden kann, so scheint meine einzige Option etwas mit den Quelldateien zu tun, die die Datei SDL2-2.0.0.tar.gz (Quellcode) aus dem Link benutzen Ich habe das oben erwähnt. Ich weiß jedoch nicht, was ich damit machen soll.

Was ich mit den Quelldateien versucht habe, ist das Importieren des Visual Studio-Projekts in Code :: Blocks und das Erstellen, aber es sagt mir "sdl-config Keine solche Datei oder Verzeichnis" (Ich weiß nicht, was das ausgelöst hat). Ich bin mir auch nicht sicher, ob das Bauen mir lediglich eine ausführbare Datei gibt, mit der ich nicht weiß, was ich tun kann, um es mit meiner eigenen ausführbaren Datei zu verknüpfen.

Ein narrensicherer Idiot Schritt für Schritt Anleitung wäre die beste Wette, um diesen Fall zu lösen.

EDIT:

ich es geschafft, die SDL-Bibliotheken mit dem Führungs Jonas vorgesehen zu kompilieren, und bekam eine libSDL2.a Datei.

Zuerst habe ich nur den Pfad von libSDL2.a zu "Link libraries:" -Sektion von Code :: Blocks hinzugefügt, aber ich habe eine Reihe von Fehlern wie "SDL_Init() nicht in diesem Bereich deklariert".

Zusätzlich zu dem Pfad libSDL2.a habe ich auch den Pfad von SDL2-2.0.0 \ include zum Suchverzeichnis des Compilers sowie den Pfad von SDL2-2.0.0 \ build.libs zur Suche des Linkers hinzugefügt Verzeichnis. Ich schrieb das auch in meine Testdatei: #include "SDL.h". Meine Testdatei sieht nun wie folgt aus:

#include "SDL.h" 

int main(int argc, char* args[]) { 
    //Start SDL 
    SDL_Init(SDL_INIT_EVERYTHING); 
    //Quit SDL 
    SDL_Quit(); 
    return 0; 
} 

Es scheint die Erklärung Problem tat beheben, aber jetzt Code :: Blocks öffnete eine SDL_mmjoystick.c Datei und gab mir noch mehr Fehler: „undefined Verweis auf‚waveInClose @ 4 '"," undefinierter Verweis auf' waveOutClose @ 4 '"," undefinierter Verweis auf' joyGetNumDevs @ 0 '"und Tonnen anderer.

Hier ist ein Screenshot von dem, was passiert ist, beachten Sie die unterschiedliche Farbe der # include Texte, ich bin nicht sicher, warum das passiert: http://gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

Ich bin nicht sicher, wie man richtig in Gebrauch diese Bibliothek zu nehmen. Irgendwelche Hilfe in diesem Fall, oder sollte ich eine andere Frage dafür stellen?

EDIT:

Ich habe -lSDL2 den Linker-Optionen und löschte die anderen Parameter. Jetzt baut es in Ordnung:

mingw32-g++.exe -Wall -fexceptions -g -IC:\Users\User\Desktop\SDL2-2.0.0\include -c "C:\Users\User\Desktop\CppProjects\SDL project\main.cpp" -o obj\Debug\main.o 
mingw32-g++.exe -Wall -fexceptions -g -IC:\Users\User\Desktop\SDL2-2.0.0\include -c "C:\Users\User\Desktop\CppProjects\SDL project\thetestfile.cpp" -o obj\Debug\thetestfile.o 
mingw32-g++.exe -LC:\Users\User\Desktop\SDL2-2.0.0\build\.libs -o "bin\Debug\SDL project.exe" obj\Debug\main.o obj\Debug\thetestfile.o -lSDL2 ..\..\SDL2-2.0.0\build\.libs\libSDL2.a C:\Users\User\Desktop\SDL2-2.0.0\build\.libs\libSDL2.a -mwindows 
Output size is 945.80 KB 
Process terminated with status 0 (0 minutes, 1 seconds) 
0 errors, 0 warnings (0 minutes, 1 seconds) 

Aber wenn ich versuche, es zu laufen, es sagt mein Computer SDL2.dll fehlt, während der ganze Punkt war zu statisch-Link.

Also habe ich derzeit den Pfad zum Erstellen/.libs in meinen Link-Bibliotheken-Einstellungen, -lSDL2 in den anderen Linker-Optionen, und für Such-Verzeichnisse habe ich den Pfad zu SDL2-2.0.0/include für den Compiler und SDL2-2.0.0/build/.libs für den Linker.

Im Verzeichnis Build/.libs kann ich auch libSDL2.a, libSDL2.dll.a, libSDL2 sehen.la und libSDL2.lai Dateien, die ich nicht weiß, was sie sind.

+0

Wenn Sie libsdl2.a explizit an den Linker vorbei sind, können Sie einfach auf '-lSDL2'. – greatwolf

Antwort

14

Es ist nicht notwendig, die Bibliothek neu kompiliert, wird SDL2 gegeben mit statisch-Link-Bibliothek namens "libSDL2.a" auf dem Ordner "SDL2-2.0.0 \ i686-w64-mingw32 \ lib \".

Nur sicher sein, diese Optionen an den Linker hinzuzufügen:

„-lmingw32 -lSDL2main -lSDL2 -mwindows -Im -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-libgcc“

auf Code: Blöcke unter "Projekt/Optionen beim Aufbau .../Linket Einstellungen/Andere Linker-Optionen"

Diese Optionen ermöglichen es Ihnen, mit zu verbinden, was SDL2.dll war verwenden.

Sie können sie auf die Datei "SDL2-2.0.0 \ i686-w64-mingw32 \ bin \ SDL2-config"

Die magische Trick besteht darin, zu löschen oder benennen Sie die Datei „libSDL2.dll.a retreive " für den Ordner" SDL2-2.0.0 \ i686-w64-mingw32 \ lib \ ". Ich habe ein "-" hinzugefügt, um es zu behalten, falls ich es brauche.

Ich weiß nicht, warum diese Bibliothek die andere überwindet und ein Hinweis würde geschätzt werden.

Ich versuchte mit Code :: Blocks 12.11 MinGW32 und es hat funktioniert.

Wenn Sie mit einigen Projekten ausführen, verwenden Dynamic Link und einige andere, die statisch-Link verwenden, werden Sie zu haben Ihre librairies halten in zwei verschiedenen Ordnern zu wissen, dass „libSDL2main.a“ in diesen beiden sein wird .

Entschuldigung für mein Schreiben, ich bin nicht gewohnt, in Englisch zu schreiben.

Mike

+6

FYI - Bei der Arbeit mit diesem Problem entdeckte ich, dass wenn Sie "-static" zur Verbindungszeit zur Befehlszeile hinzufügen, zwingt es den Mingw-Linker, die statische Bibliothek gegenüber der dynamischen vorzuziehen, so dass Sie nicht löschen müssen oder benennen Sie die Datei libSDL2.dll.a um, damit sie funktioniert. – Syndog

Verwandte Themen