Makefile - plik z kilkoma modułami

0

Witam, potrzebuje pomocy. Napisałem plik makefile, któy kompiluje mi program w c++ z plików : plik.cpp (zawierający main), punkt.h, punkt.cpp (zaierający deklaracje i definicje klasy punkt.cpp). Niestety nie mam dostępu do żanego systemu uniks czy mógłby ktoś zobaczyć czy w razie uzycia tego make'a program poprawnie mi sie skompiluje a pozniej usunie pliki z rozszerzeniem .o?

plik:plik.o punkt.o punkt.h
        g++ -Wall -ansi -pedantic -lm plik.cpp punkt.o -o plik
plik.o:plik.cpp
        g++ -Wall -ansi -pedantic plik.cpp
punkt.o:punkt.cpp punkt.h
        g++ -c -Wall -ansi -pedantic punkt.cpp
.PHONY:clean
        rm -f *~
        rm -f *.bak
        rm -f punkt.o plik.oplik:plik.o punkt.o

Dzięki za pomoc.

1

Nie. Ale taki owszem:

.PHONY: clean

plik: plik.o punkt.o punkt.h
	g++ -Wall -ansi -pedantic -lm plik.cpp punkt.o -o plik

plik.o: plik.cpp
	g++ -Wall -ansi -pedantic plik.cpp

punkt.o: punkt.cpp punkt.h
	g++ -c -Wall -ansi -pedantic punkt.cpp

clean:
	@rm -f *~ *.bak punkt.o plik.o > /dev/null >&

Tylko pamiętaj aby każde wcięcie było wykonane tabulatorem i plik (dla GNU Make) nazywał się Makefile (z dużej litery)

0

Dzięki wielkie :d

0

Można nawet lepiej:

# Parę zmiennych, nazwy powinny Ci powiedzieć co co oznacza
CXX=c++
FLAGS=-Wall -pedantic -ansi
LFLAGS=-lm
SOURCES=plik.cpp punkt.cpp
OBJECTS=$(SOURCES:.cpp=.o) # To oznacza, że wszystkie elementy w `$(SOURCES)` będą miały zamienioną końcówkę `.cpp` na `.o`
EXECUTABLE=plik

# Dobrą praktyką jest dodawanie dyrektywy `all` jako pierwszej dzięki czemu wywołanie `make` zbuduje cały projekt
all: $(EXECUTABLE)

$(EXECTUTABLE): $(OBJECTS)
	$(CXX) $(LFLAGS) $+ -o $@ # Zmienna `$+` oznacza podanie wszystkich plików wejściowych w takiej samej kolejności jak są wylistowane na liście zależności (z powtórzeniami)
		# Zmienna `$@` oznacza nazwę pliku wyjściowego

# Dla każdego pliku `.cpp` zbuduj odpowiadający mu plik `.o` przy pomocy tego skryptu
.cpp.o:
	$(CXX) $(FLAGS) $< -o $@ # Zmienna `$<` oznacza pierwszy element na liście zależności

clean:
	rm -f $(OBJECTS) $(EXECUTABLE)

.PHONY: all clean

Dzięki takiemu zapisowi dodanie nowych plików do projektu będzie przynajmniej idiotycznie łatwe i bezbolesne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1