static lib mit g++

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

static lib mit g++

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

Re: static lib mit g++

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?

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: static lib mit g++

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

Re: static lib mit g++

Beitrag von nufan » Mo Aug 04, 2014 12:12 am

Baust du mit VS oder Mingw?

EDIT:
Ah, g++ laut Makefile (und Thread-Titel :D) ^^ Ich denke dann solltest du doch die *.a Bibliotheken verwenden. *.lib ist soweit ich weiß nur für VS.

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: static lib mit g++

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).

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: static lib mit g++

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'

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: static lib mit g++

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

Re: static lib mit g++

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.

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: static lib mit g++

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

Re: static lib mit g++

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.

Antworten