Programowanie w C++ Wykład 10 Katarzyna Grzelak 21 maja 2018 K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21
Makefiles K.Grzelak (Wykład 10) Programowanie w C++ 2 / 21
Kompilacja programu zapisanego w kilku plikach Gdy program złożony z niewielkiej liczby plików: g++ -o prog prog.cc Wektor2D.cc Gdy więcej plików (Linux): Program make/gmake Proces kompilacji, linkowania... zapisany w pliku Makefile K.Grzelak (Wykład 10) Programowanie w C++ 3 / 21
Makefiles Proces kompilacji zapisany w tekstowym pliku (Makefile) Podstawa: Przyporzadkowanie krótkich nazw celów(targets) do rzadanej akcji. K.Grzelak (Wykład 10) Programowanie w C++ 4 / 21
Makefiles Zalety: Cała informacja o procesie przetwarzania plików źródłowych na końcowy program w jednym miejscu. Można łatwo wybrać poszczególne elementy tego procesu. Kompilacja (automatycznie) tylko tych plików, w których były zmiany. K.Grzelak (Wykład 10) Programowanie w C++ 5 / 21
Przypomnienie - od kodu źródłowego do kodu maszynowego w C++ Source File Source File Preprocessor Preprocessor Processed Code Processed Code Compiler Compiler Object File Object File Linker Executable Libraries OS Program in Memory Po etapie kompilacji pliki z rozszerzeniem.o (object files ). K.Grzelak (Wykład 10) Programowanie w C++ 6 / 21
Makefiles Uruchomienie make albo Przykład dla celu clean make clean Jeśli nie podana nazwa pliku, to automatycznie uruchamiany plik o nazwie Makefile lub makefile K.Grzelak (Wykład 10) Programowanie w C++ 7 / 21
Makefiles Opcje polecenia make: Opcja Przykład użycia -f make -f plik -n make -n Opcja -f jesli plik Makefile nazywa się plik. Opcja -n jeśli chcemy zobaczyć jakie polecenia zostana uruchomione (bez ich uruchamiania). K.Grzelak (Wykład 10) Programowanie w C++ 8 / 21
Struktura pliku Makefile Najważniejsza część pliku Makefile to definicje celów: cel: [zależności] polecenie Każde polecenie musi być poprzedzone tabulatorem!!!!! make clean oznacza że zostanie uruchomione polecenie, które znajduje się za celem clean Komentarze zaczynaja się od znaku # K.Grzelak (Wykład 10) Programowanie w C++ 9 / 21
Struktura pliku Makefile Przykład clean: rm -f *.o * Pliki które chcemy usunać moga nie istnieć. Jeżeli chcemy żeby sytuacja tego typu nie generowała błędu, to dodajemy minus przed poleceniem, np.: Przykład clean: -rm -f *.o * K.Grzelak (Wykład 10) Programowanie w C++ 10 / 21
Struktura pliku Makefile Przykład pliku Makefile do kompilacji pojedynczego pliku wskazniki: wskazniki.cc g++ -o wskazniki wskazniki.cc Po prawej stronie dwukropka lista plików lub celów od których zależy cel po lewej stronie dwukropka. Polecenie nie będzie uruchomione jeśli cel został stworzony później niż pliki z listy zależności. K.Grzelak (Wykład 10) Programowanie w C++ 11 / 21
Działanie Makefile Polecenia nie sa wykonywane w takiej kolejności, w jakiej sa zapisane w pliku. K.Grzelak (Wykład 10) Programowanie w C++ 12 / 21
Struktura pliku Makefile Rozdzielenie procesu kompilacji i linkowania: Przykład wskazniki: wskazniki.o g++ -o wskazniki wskazniki.o wskazniki.o: wskazniki.cc g++ -c wskazniki.cc Jeżeli plików jest więcej nie trzeba za każdym razem kompilować wszystkiego. K.Grzelak (Wykład 10) Programowanie w C++ 13 / 21
Struktura pliku Makefile Celów w Makefile może być dużo. Po napisaniu make bez nazwy celu wykonywany jest pierwszy z nich. Przykład wskazniki: wskazniki.o g++ -o wskazniki wskazniki.o wskazniki.o: wskazniki.cc g++ -c wskazniki.cc prep: g++ -E wskazniki.cc clean: -rm -f * *.o wskazniki K.Grzelak (Wykład 10) Programowanie w C++ 14 / 21
Struktura pliku Makefile Definicje Przykłady CXX=g++ -std=c++11 PROG = wskazniki.cc Odwoływanie się do zdefiniowanych wcześniej nazw: $(CXX) $(PROG) K.Grzelak (Wykład 10) Programowanie w C++ 15 / 21
Kompilacja programu złożonego z kilku plików Przykład dla klasy Wektor2D z poprzedniego wykładu prog: Wektor2D.o prog.o g++ -o prog Wektor2D.o prog.o Wektor2D.o: Wektor2D.cc Wektor2D.h g++ -c Wektor2D.cc prog.o: prog.cc Wektor2D.h g++ -c prog.cc K.Grzelak (Wykład 10) Programowanie w C++ 16 / 21
Kompilacja programu złożonego z kilku plików Ważne Pliki nagłówkowe musza być na liście zależności. K.Grzelak (Wykład 10) Programowanie w C++ 17 / 21
Struktura pliku Makefile Niektóre uzywane skróty: $@ cel (to co przed dwukropkiem) $ˆ zależności (to co za dwukropkiem) $< pierwszy element z listy za dwukropkiem %.o:%.cc stworzenie plików.o ze wszystkich dostępnych plików.cc bez konieczności definiowania konkretnych nazw K.Grzelak (Wykład 10) Programowanie w C++ 18 / 21
Kompilacja programu złożonego z kilku plików Przykład dla klasy Wektor2D z poprzedniego wykładu: prog: Wektor2D.o prog.o g++ -o $@ $ˆ Wektor2D.o: Wektor2D.cc Wektor2D.h g++ -c $< prog.o: prog.cc Wektor2D.h g++ -c $< K.Grzelak (Wykład 10) Programowanie w C++ 19 / 21
Kompilacja programu złożonego z kilku plików Przykład dla klasy Wektor2D z poprzedniego wykładu: prog: Wektor2D.o prog.o g++ -o $@ $ˆ %.o:%.cc Wektor2D.h g++ -c $< K.Grzelak (Wykład 10) Programowanie w C++ 20 / 21
Kompilacja programu złożonego z kilku plików Przykład dla klasy Wektor2D z poprzedniego wykładu: OBJS=Wektor2D.o prog.o prog: $(OBJS) g++ -o $@ $ˆ %.o:%.cc Wektor2D.h g++ -c $< K.Grzelak (Wykład 10) Programowanie w C++ 21 / 21