Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

01.08.2014, 15:00

Makefile

Hallo,

ich wollte mich von eclipse lösen, hauptsächlich da mir die leichtgewichtigen Editoren wie z.B. adobe/brackets doch besser gefallen.
Ich nutzte jetzt ATOM von GitHub.

Da ich die C++ Projekte jetzt so nicht mehr per Klick anschmeißen kann, versuche ich make zu lernen.
Am liebsten hätte ich jetzt gerne einmal ein vernünftiges Template, dass man dann auf im Prinzip jedes Projekt übertragen kann, sofern dass denn geht.

Mein Testprogramm dafür ist so aufgebaut:

Quellcode

1
2
3
4
5
6
+ src
   - main.cpp
   - test.h
   - test.cpp
- Makefile
- readme


So, alles in src soll natürlich compiliert und gelinkt werden.
Das klappt auch, ich lese alle *.cpp Dateien mit $(shell find -name '*.cpp') ein, so dass ich also dafür schon mal nichts ins Makefile schreiben muss.

Die Ausgabe ist allerdings komisch. Ich habe 2 Optionen definiert (Variablen), die einmal einen Ausgabeordner und den Namen der Binärdatei angeben.
Die Binärdatei ist dann da und läuft. Aber die ganzen Objektdateien fehlen.

Hier mal das Makefile:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# compiler settings
CC          = g++
CFLAGS      =
LDFLAGS     =

# output settings
BIN         = test
OUT         = out
OBJ         = $(shell find -name '*.cpp')

# --- DO NOT EDIT BELOW ---

all:        $(OBJ); \
            mkdir -p $(OUT) && \
            $(CC) $(CFLAGS) $(OBJ) -o $(OUT)/$(BIN) $(LDFLAGS)

*.o:        *.cpp; \
            $(CC) -c $<

run:        all; \
            ./$(OUT)/$(BIN)

clean:      ; \
            rm -rf $(OUT)


Wohin verschwinden die? Ich hab die ganze Platte durchsucht, einfach weg.
Am besten wäre es wenn im Grunde die Ordnerstruktur von src übernommen wird, und dann entsprechend die .o Dateien dort eingefügt werden. Passend zu den cpp Dateien eben.

Und dann noch die Frage zu Abhängigkeiten. Muss ich irgendwas beachten wenn ich Bibliotheken verwende? Es sollte doch eigentlich reichen die an den Linker zu hängen (hier LDFLAGS).
Ich habe häufiger gesehen dass irgendwelche includes dort noch definiert wurden... aber verstanden habe ich das nicht.

[Edit]

Ah ich seh gerade, ich habe ja in OBJ nur cpp Dateien... ist das schlimm?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

01.08.2014, 15:20

Okay, schon mal etwas näher:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# [...]

all:        $(patsubst %.cpp, %.o, $(OBJ)); \
            mkdir -p $(OUT) && \
            $(CC) $(CFLAGS) $(patsubst %.cpp, $(OUT)/%.o, $(OBJ)) -o $(OUT)/$(BIN) $(LDFLAGS)

%.o:        %.cpp; \
            $(CC) -c $< -o $(patsubst %.cpp, $(OUT)/%.o, $<)

run:        all; \
            ./$(OUT)/$(BIN)

clean:      ; \
            rm -rf $(OUT)


Erzeugt jetzt die .o Dateien wo sie hin sollen, allerdings muss ich die Ordnerstruktur noch selbst erzeugen...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

01.08.2014, 15:49

Jupei, sorry dass ich das Forum hier manchmal als Blog nutze, aber ich habs (vielleicht hilfts ja noch wem):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# compiler settings
CC          = g++
CFLAGS      =
LDFLAGS     =

# output settings
BIN         = test
OUT         = out

# --- DO NOT EDIT BELOW ---

OBJ         = $(shell find -name '*.cpp')

all:        $(patsubst %.cpp, %.o, $(OBJ)); \
            mkdir -p $(OUT) && \
            $(CC) $(CFLAGS) $(patsubst %.cpp, $(OUT)/%.o, $(OBJ)) -o $(OUT)/$(BIN) $(LDFLAGS)

%.o:        %.cpp; \
            mkdir -p $(OUT)/`dirname $<` --parents && \
            $(CC) -c $< -o $(patsubst %.cpp, $(OUT)/%.o, $<)

run:        all; \
            ./$(OUT)/$(BIN)

clean:      ; \
            rm -rf $(OUT)


Erstellt aus der Ordnerstruktur von oben die Binärdatei "test" im Ordner "out", wobei alle .o Dateien in "out" entsprechend ihres Ordners angelegt werden.
Also z.B. aus:

Quellcode

1
2
3
4
5
6
7
+ src
   + lib
      - test.h
      - test.cpp
   - main.cpp
- Makefile
- readme


wird:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
+ out
   + src
      + lib
         - test.o
      - main.o
   test
+ src
   + lib
      - test.h
      - test.cpp
   - main.cpp
- Makefile
- readme


Aufruf von "make" compiliert, "make run" compiliert und startet und "make clean" löscht den "out" Ordner.

Wenn Fehler auffallen bitte melden!

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

4

01.08.2014, 16:18

cmake ;)
Benutzer ich mittlerweile für jedes meiner Projekte...

Freundliche Grüße
Stazer

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

01.08.2014, 16:26

Ist vielleicht besser, mein makefile hat mit includes offenbar Probleme :P

Werbeanzeige