Schnelle objektorientierte, kompilierende Programmiersprache.
-
Architekt
- Beiträge: 172
- Registriert: Sa Mai 24, 2014 12:04 pm
Beitrag
von Architekt » Mo Aug 04, 2014 12:02 am
Moin. Ich möchte eine statische lib für mein Projekt bauen. Dieses verwendet mehrere Komponenten der SDL und deswegen würde ich gerne die SDL zugehörigen lib files sowie meine Komponenten (meine *.cpp Dateien) in eine lib zusammenfassen.
Doch irgendwie klappt das nicht.
Ich habe folgendes make Script:
Code: Alles auswählen
CC = g++
CFLAGS = -c -std=c++0x -Wall
INCLUDES = -I C:\Users\Besitzer\Documents\SGL\include \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2\include \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\include \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\include \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\include \
-I C:\Users\Besitzer\Documents\SGL\libs\Glew\include
LIBS = C:\Users\Besitzer\Documents\SGL\libs\SDL2\lib\x86\SDL2.lib \
C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\lib\x86\SDL2_image.lib \
C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\lib\x86\SDL2_mixer.lib \
C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\lib\x86\SDL2_ttf.lib \
C:\Users\Besitzer\Documents\SGL\libs\Glew\lib\Release\Win32\glew32.lib
OTHER = -lopengl32
all: Graphic Event Math Window Link clean
Graphic:
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Color.cpp
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Surface.cpp
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Texture.cpp
Event:
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Event\Event.cpp
Math:
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Math\mat4.cpp
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Math\Vertex.cpp
Window:
$(CC) $(CFLAGS) $(INCLUDES) $(OTHER) C:\Users\Besitzer\Documents\SGL\src\SGL\Window\Window.cpp
Link:
ar crv SGL.lib Color.o Surface.o Texture.o Event.o mat4.o Vertex.o Window.o $(LIBS)
clean:
rm *.o
Doch wenn ich nun versuche, eine Datei zu kompilieren, die meine Dateien benutzen soll, dann kommt der Fehler, dass die SDL lib's fehlen (also die Referenzen).
Was mache ich falsch? Oder ist mein Vorhaben überhaupt nicht möglich?
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mo Aug 04, 2014 12:09 am
Du verwendest auch die dynamisch gelinkten Bibliotheken von SDL (*.lib), hast du es schon mit den statischen Bibliotheken (*.a) versucht?
-
Architekt
- Beiträge: 172
- Registriert: Sa Mai 24, 2014 12:04 pm
Beitrag
von Architekt » Mo Aug 04, 2014 12:10 am
Ich bin auf Windows, dort sind die statischen die *.lib und die dynamischen die *.dll.
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mo Aug 04, 2014 12:12 am
Baust du mit VS oder Mingw?
EDIT:
Ah, g++ laut Makefile (und Thread-Titel

) ^^ Ich denke dann solltest du doch die *.a Bibliotheken verwenden. *.lib ist soweit ich weiß nur für VS.
-
Architekt
- Beiträge: 172
- Registriert: Sa Mai 24, 2014 12:04 pm
Beitrag
von Architekt » Mo Aug 04, 2014 9:12 pm
Ah guter Einwand. Ich habe mein Makefile überarbeitet:
Code: Alles auswählen
CC = g++
CFLAGS = -c -std=c++0x -Wall
INCLUDES = -I C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\include \
-I C:\Users\Besitzer\Documents\SGL\libs\glew\include
LIBS = -L C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\glew\lib\Release\Win32
LIB_FLAGS = -lopengl32 -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf
all: Graphic Event Math Window Link clean
Graphic:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Color.cpp
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Surface.cpp
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Texture.cpp
Event:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Event\Event.cpp
Math:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Math\mat4.cpp
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Math\Vertex.cpp
Window:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) C:\Users\Besitzer\Documents\SGL\src\SGL\Window\Window.cpp
Link:
ar crv SGL.a Color.o Surface.o Texture.o Event.o mat4.o Vertex.o Window.o
clean:
del *.o
Aber das Problem besteht weiterhin: Es reicht nicht, einfach die SGL.a zu linken. Ich bekomme weiterhin Fehler über Missing References, die in anderen libs stecken (wie SDL2.a).
-
Architekt
- Beiträge: 172
- Registriert: Sa Mai 24, 2014 12:04 pm
Beitrag
von Architekt » Mo Aug 04, 2014 9:30 pm
Ok, ich habe herausgefunden, dass man die exstierenden libraries erstmal wieder in ihre *.o Derivate aussplitten muss (z.B. ar x libSDL.a), und dann anschließend zusammenfassen kann:
Code: Alles auswählen
CC = g++
CFLAGS = -c -std=c++0x -Wall
INCLUDES = -I C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\include \
-I C:\Users\Besitzer\Documents\SGL\libs\glew\include
LIBS = -L C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\glew\lib\Release\Win32
LIB_FLAGS = -lopengl32 -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf
LIB_FILES = C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\lib\libSDL2.a \
C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\lib\libSDL2_image.a \
C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\lib\libSDL2_mixer.a \
C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\lib\libSDL2_ttf.a \
C:\Users\Besitzer\Documents\SGL\libs\glew\lib\Release\Win32\glew32.lib
all: Graphic Event Math Window Link clean
Graphic:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Color.cpp \
C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Surface.cpp \
C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Texture.cpp
Event:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Event\Event.cpp
Math:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Math\mat4.cpp \
C:\Users\Besitzer\Documents\SGL\src\SGL\Math\Vertex.cpp
Window:
$(CC) $(CFLAGS) $(LIB_FLAGS) $(INCLUDES) $(LIBS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Window\Window.cpp
Link:
ar x $(LIB_FILES)
ar crv SGL.a *.o
clean:
del *.o
Doch das Problem bleibt: Linke ich nur die SGL.a meckert der Linker, dass es undefinierte Referenzen gibt.
edit:
Mein Kompilierungsversuch sowie Ausgabe (die SGL.a habe ich in libSGL.a umbenannt):
C:\Users\Besitzer\Documents\SGL>g++ -o main.exe main.cpp -O0 -Wall -std=c++0x -I
C:\Users\Besitzer\Documents\SGL\include -I C:\Users\Besitzer\Documents\SGL\libs
\SDL2\include -I C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\include -I C:\U
sers\Besitzer\Documents\SGL\libs\SDL2_ttf\include -I C:\Users\Besitzer\Documents
\SGL\libs\SDL2_mixer\include -I C:\Users\Besitzer\Documents\SGL\libs\Glew\includ
e -LC:\Users\Besitzer\Documents\SGL -lSGL
C:\Users\Besitzer\Documents\SGL/libSGL.a(Window.o):Window.cpp:(.text+0xe): undef
ined reference to `SDL_WasInit'
C:\Users\Besitzer\Documents\SGL/libSGL.a(Window.o):Window.cpp:(.text+0x23): unde
fined reference to `SDL_Init'
C:\Users\Besitzer\Documents\SGL/libSGL.a(Window.o):Window.cpp:(.text+0x3c): unde
fined reference to `SDL_Quit'
C:\Users\Besitzer\Documents\SGL/libSGL.a(Window.o):Window.cpp:(.text+0x50): unde
fined reference to `glDisable@4'
-
Architekt
- Beiträge: 172
- Registriert: Sa Mai 24, 2014 12:04 pm
Beitrag
von Architekt » Mo Aug 04, 2014 10:21 pm
Ok, mein letzter Versuch sieht mittlerweile so aus:
Code: Alles auswählen
CC = g++
CFLAGS = -c -std=c++0x
#-Wall
INCLUDES = -I C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\include\SDL2 \
-I C:\Users\Besitzer\Documents\SGL\include \
-I C:\Users\Besitzer\Documents\SGL\libs\glew\include
LIB_FLAGS = -lopengl32 -lmingw32 -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf
LIBS = -L C:\Users\Besitzer\Documents\SGL\libs\SDL2\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_image\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_mixer\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\SDL2_ttf\x86_64-w64-mingw32\lib \
-L C:\Users\Besitzer\Documents\SGL\libs\glew\lib\Release\Win32
all: Graphic Event Math Window Link clean
Graphic:
$(CC) $(CFLAGS) $(INCLUDES) $(LIBS) $(LIB_FLAGS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Color.cpp \
C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Surface.cpp \
C:\Users\Besitzer\Documents\SGL\src\SGL\Graphic\Texture.cpp
Event:
$(CC) $(CFLAGS) $(INCLUDES) $(LIBS) $(LIB_FLAGS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Event\Event.cpp
Math:
$(CC) $(CFLAGS) $(INCLUDES) $(LIBS) $(LIB_FLAGS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Math\mat4.cpp \
C:\Users\Besitzer\Documents\SGL\src\SGL\Math\Vertex.cpp
Window:
$(CC) $(CFLAGS) $(INCLUDES) $(LIBS) $(LIB_FLAGS) \
C:\Users\Besitzer\Documents\SGL\src\SGL\Window\Window.cpp
Link:
g++ -shared $(INCLUDES) -o SGL.dll *.o
clean:
del *.o
Es funktioniert nicht. Ich geb's so langsam auf, es scheint unmöglich mit MinGW eine statische lib oder eine dll zu erzeugen. Mit VS war es so _dermaßen_ einfach. o.O
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mo Aug 04, 2014 11:08 pm
Ich hab das jetzt bei mir unter Linux nachgebaut und ich bin mir nicht sicher, ob das wirklich willst. Ich habs geschafft SDL selbst in mein Archiv einzufügen, allerdings musst du dann entweder alle Abhängigkeiten von SDL selbst dynamisch linken oder ebenfalls ins Archiv packen. Damit verlierst du die Plattformunabhängigkeit, bei mir sucht er nämlich z.B. die ganzen X-Bibliotheken.
-
Architekt
- Beiträge: 172
- Registriert: Sa Mai 24, 2014 12:04 pm
Beitrag
von Architekt » Mo Aug 04, 2014 11:11 pm
Mein Ziel war es halt, das ich eben nicht mehr dauernd die SDL *.a Dateien linken muss, sondern nur eine *.a Datei habe. Ist das nicht möglich?
-
nufan
- Wiki-Moderator
- Beiträge: 2558
- Registriert: Sa Jul 05, 2008 3:21 pm
Beitrag
von nufan » Mo Aug 04, 2014 11:14 pm
Architekt hat geschrieben:Mein Ziel war es halt, das ich eben nicht mehr dauernd die SDL *.a Dateien linken muss, sondern nur eine *.a Datei habe.
Was stört dich daran mehrere *.a Dateien zu linken? Was ist der Vorteil darin eine große Datei zu linken anstatt mehrerer kleiner?
Architekt hat geschrieben:Ist das nicht möglich?
Theoretisch ist es möglich, praktisch würde ich dir stark davon abraten.