Makefile

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Makefile

Beitrag von Halan »

Hey,

ich versuch gerade ein Makefile für meine OpenSource Network-Library zu schreiben. Tu mir da aber noch schwer.

Zwei Probleme habe ich:
1. Die Object Files werden nicht automatisch erstellt sondern immer nur eins dann bricht es ab weil es die anderen nich finden kann. Wenn ich make ein paar mal ausführe geht es dann weil alle erstellt wurden. (Hoff ich versteht was ich damit mein :P )

2. Ich linke gegen "rt" was mir einige Fehlermeldungen verursacht:
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -o libOpenNetwork.so.0.4.0 CTCPPort.o CUDPPort.o BitStream.o main.o common.o -lrt -I ./extensions/ -I ./include/
/usr/lib/gcc/x86_64-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
collect2: ld gab 1 als Ende-Status zurück
make: *** [libOpenNetwork.so] Fehler 1
Hier das Makefile

Code: Alles auswählen

CXX = g++
OBJECTS = CTCPPort.o CUDPPort.o BitStream.o main.o common.o
LIBS = -lrt
INCLUDES = -I ./extensions/ -I ./include/
CFLAGS = -Wall -O2
BINDIR = $(DESTDIR)/usr/bin
MAJOR = 0
MINOR = 4
BUILD = 0
VERSION = $(MAJOR).$(MINOR).$(BUILD)
NAME = libOpenNetwork.so
	
all: $(NAME)
.PHONY: all
	
$(NAME): $(OBJECTS)
	$(CXX) -o $(NAME).$(VERSION) $(OBJECTS) $(LIBS) $(INCLUDES)

%.o: %.cpp
	$(CXX) -c $(OBJECTS) $(CFLAGS) $(INCLUDES) $<

BitStream.o : ./extensions/BitStream/BitStream.cpp
	$(CXX) -c $(OBJECTS) $(CFLAGS) $(INCLUDES) $<

install:
	install --mode=755 $(NAME).$(VERSION) $(BINDIR)/ 
	cp -S $(BINDIR)/$(NAME).$(VERSION) $(BINDIR)/$(NAME).$(MAJOR).$(MINOR)
	cp -S $(BINDIR)/$(NAME).$(VERSION) $(BINDIR)/$(NAME).$(MAJOR)

clean:
	rm *.o

uninstall:
	rm $(BINDIR)/$(NAME)
grüße,
Halan
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Makefile

Beitrag von Jörg »

Fuer den 2. Buildschritt solltest Du statt g++ ld benutzen, wenn Du eine dynamische/statische Bibliothek bauen willst. Das erklaert zumindest das fehlende "main"-Symbol.
Deine Regeln fuer die Erstellung der object-Files sehen fuer mich etwas ungewoehnlich aus.

Ich verwende:
%.o:%.cpp
$(CXX) -c $(CXXFLAGS) $(INCLUDEPATH) $< -o $@

Ein Tipp: Bevor man lange rumdoktort und Regeln von irgendwo kopiert usw.... 'make' zeigt ja immer an, was gemacht wird. Sobald da schon eine Zeile seltsam aussieht (z.B. bin ich verwundert ob Deines Aufrufes von "g++ -c $(OBJECTS)" sollte man das Makefile anschauen.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Makefile

Beitrag von kimmi »

Ich wuerde zum Linken weiterhin den gcc / g++ verwenden. Und wenn du eine Shared-Object-Library erstellen willst ( was ich deinem Makefile aufgrund der Namensgebung entnehme ), musst du dieses dem Compiler per -shared mitteilen. Hast du eine Main definiert ( fuer eine Library ja eher unwahrscheinlich )? Wenn nein: der Compiler sucht fuer ein Executable nach einer main, findet die aufgrund der Tatsache nicht, dass du eine Lib bauen willst und motzt :-). Daher der Fehler, den du siehst.

Hier findest du mehr zu dem Thema: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html .
Und ich benutze mittlerweile cmake zum Erstellen von Makefiles, macht einem das leben leichter und erstellt portable Makefiles, VC-Projekte und haste nicht gesehen.

Gruss Kimmi
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: Makefile

Beitrag von Halan »

vielen dank :D

es geht jetzt, aber das erste problem ist immernoch da. Ich hab jetzt mal den console output kopiert damit ihr euch das vorstellen könnt
kai@Kai-Desktop:~/Development/OpenNetwork$ make clean
rm *.o
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/ CTCPPort.cpp
g++: CTCPPort.o: No such file or directory
g++: CUDPPort.o: No such file or directory
g++: BitStream.o: No such file or directory
g++: main.o: No such file or directory
g++: common.o: No such file or directory
make: *** [CTCPPort.o] Fehler 1
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/ CUDPPort.cpp
g++: CUDPPort.o: No such file or directory
g++: BitStream.o: No such file or directory
g++: main.o: No such file or directory
g++: common.o: No such file or directory
make: *** [CUDPPort.o] Fehler 1
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/ extensions/BitStream/BitStream.cpp
g++: BitStream.o: No such file or directory
g++: main.o: No such file or directory
g++: common.o: No such file or directory
make: *** [BitStream.o] Fehler 1
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/ main.cpp
g++: main.o: No such file or directory
g++: common.o: No such file or directory
make: *** [main.o] Fehler 1
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/ common.cpp
g++: common.o: No such file or directory
make: *** [common.o] Fehler 1
kai@Kai-Desktop:~/Development/OpenNetwork$ make
g++ -o libOpenNetwork.so.0.4.0 -Wall -O2 -shared -fPIC CTCPPort.o CUDPPort.o BitStream.o main.o common.o -lrt -I ./extensions/ -I ./include/
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Makefile

Beitrag von kimmi »

Ich glaub, gerade kommt etwas bei dir durcheinander. Als erstes musst du die Objects per g++ erstellen. Danach musst du dann die shared Libraries erstellen.

Code: Alles auswählen

g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/g++ -c CTCPPort.o CUDPPort.o BitStream.o main.o common.o -Wall -O2 -shared -fPIC -I ./extensions/ -I ./include/ CTCPPort.cpp
Hier versuchst du eine Shared Library zu generieren, willst aber gleichzeitig das File CTCPPort.cpp uebersetzen. Da du mit dem linken anfaengst, du aber noch gar kein Object-File haben kann ( du will ja erst einmal compilieren ) findet er das *.o File nicht und motzt:

Code: Alles auswählen

No such file or directory
Schau mal da rein und ueberarbeite dein Makefile:
http://www.ijon.de/comp/tutorials/makefile.html

Dann klappt das aus mit dem Builden unter Linux :).

Kimmi
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: Makefile

Beitrag von Halan »

Wollt mich nochmal bedanken hier. Habs jetzt endlich geschafft zu builden und das ganze auch als debian-packet in zu packen :)

grüße,
Halan
Antworten