From MJanik
(Difference between revisions)
|
|
| Line 1: |
Line 1: |
| | [http://www.if.pw.edu.pl/~majanik/data/JP/2012/makefile.pdf Makefile - instrukcja] | | [http://www.if.pw.edu.pl/~majanik/data/JP/2012/makefile.pdf Makefile - instrukcja] |
| | + | |
| | + | <hr /> |
| | + | |
| | + | '''<u> Makefile </u> |
| | + | |
| | + | ''' Czym jest Makefile? |
| | + | Makefile to plik konfiguracyjny używany przez narzędzie <code>make</code> do automatyzacji procesu kompilacji. |
| | + | Pozwala definiować zasady budowania programu: które pliki należy skompilować, w jakiej kolejności i z jakimi poleceniami. |
| | + | |
| | + | ''' Po co stosować Makefile? |
| | + | * Automatyzuje budowę programu (kompilacja, linkowanie, czyszczenie plików pośrednich). |
| | + | * Skraca czas — kompilowane są tylko pliki, które zostały zmodyfikowane. |
| | + | * Upraszcza pracę w dużych projektach z wieloma plikami źródłowymi. |
| | + | * Pozwala definiować własne cele (targets), np. <code>make clean</code>. |
| | + | |
| | + | ''' Najczęstsze elementy Makefile |
| | + | * *Cel (target)* – nazwa zadania, np. <code>main</code>. |
| | + | * *Reguła (rule)* – określa zależności i polecenia, które mają zostać wykonane. |
| | + | * *Zależności (dependencies)* – pliki, od których zależy dany cel. |
| | + | * *Polecenia (commands)* – komendy wykonywane przez <code>make</code> (musi je poprzedzać tabulator!). |
| | + | |
| | + | ''' Przykładowy Makefile |
| | + | <verbatim> |
| | + | CXX=g++ |
| | + | CXXFLAGS=-Wall -O2 |
| | + | |
| | + | main: main.o utils.o |
| | + | $(CXX) $(CXXFLAGS) main.o utils.o -o main |
| | + | |
| | + | main.o: main.cpp utils.hpp |
| | + | utils.o: utils.cpp utils.hpp |
| | + | |
| | + | clean: |
| | + | rm -f *.o main |
| | + | </verbatim> |
| | + | |
| | + | ''' Kiedy używać Makefile? |
| | + | * Gdy projekt składa się z więcej niż jednego pliku źródłowego. |
| | + | * Gdy chcesz mieć powtarzalny i automatyczny proces budowania. |
| | + | * Gdy potrzebujesz wygodnego sposobu zarządzania kompilacją i plikami pośrednimi. |
| | + | |
| | + | ''' Podsumowanie |
| | + | Makefile jest prostym, ale bardzo skutecznym narzędziem umożliwiającym automatyzację kompilacji w projektach C/C++. |
| | + | Ułatwia zarządzanie kodem, oszczędza czas i pozwala utrzymać porządek w projekcie. |
| | + | |
| | + | |
| | + | |
| | + | |
| | + | |
| | | | |
| | | | |
| Line 26: |
Line 75: |
| | | | |
| | ''' Przykład użycia | | ''' Przykład użycia |
| - | <verbatim>
| |
| - | #include <vector>
| |
| - | #include <iostream>
| |
| | | | |
| - | int main() { | + | #include <vector> |
| | + | #include <iostream> |
| | + | |
| | + | int main() { |
| | std::vector<int> liczby; | | std::vector<int> liczby; |
| - |
| |
| | liczby.push_back(10); | | liczby.push_back(10); |
| | liczby.push_back(20); | | liczby.push_back(20); |
| | liczby.push_back(30); | | liczby.push_back(30); |
| - |
| |
| | for (size_t i = 0; i < liczby.size(); i++) { | | for (size_t i = 0; i < liczby.size(); i++) { |
| | std::cout << liczby[i] << std::endl; | | std::cout << liczby[i] << std::endl; |
| Line 42: |
Line 89: |
| | | | |
| | return 0; | | return 0; |
| - | } | + | } |
| - | </verbatim>
| + | |
| | | | |
| | ''' Kiedy używać <code>std::vector</code>? | | ''' Kiedy używać <code>std::vector</code>? |
Revision as of 13:23, 19 November 2025
Makefile - instrukcja
Makefile
Czym jest Makefile?
Makefile to plik konfiguracyjny używany przez narzędzie make do automatyzacji procesu kompilacji.
Pozwala definiować zasady budowania programu: które pliki należy skompilować, w jakiej kolejności i z jakimi poleceniami.
Po co stosować Makefile?
* Automatyzuje budowę programu (kompilacja, linkowanie, czyszczenie plików pośrednich).
* Skraca czas — kompilowane są tylko pliki, które zostały zmodyfikowane.
* Upraszcza pracę w dużych projektach z wieloma plikami źródłowymi.
* Pozwala definiować własne cele (targets), np. make clean.
Najczęstsze elementy Makefile
* *Cel (target)* – nazwa zadania, np. main.
* *Reguła (rule)* – określa zależności i polecenia, które mają zostać wykonane.
* *Zależności (dependencies)* – pliki, od których zależy dany cel.
* *Polecenia (commands)* – komendy wykonywane przez make (musi je poprzedzać tabulator!).
Przykładowy Makefile
<verbatim>
CXX=g++
CXXFLAGS=-Wall -O2
main: main.o utils.o
$(CXX) $(CXXFLAGS) main.o utils.o -o main
main.o: main.cpp utils.hpp
utils.o: utils.cpp utils.hpp
clean:
rm -f *.o main
</verbatim>
Kiedy używać Makefile?
* Gdy projekt składa się z więcej niż jednego pliku źródłowego.
* Gdy chcesz mieć powtarzalny i automatyczny proces budowania.
* Gdy potrzebujesz wygodnego sposobu zarządzania kompilacją i plikami pośrednimi.
Podsumowanie
Makefile jest prostym, ale bardzo skutecznym narzędziem umożliwiającym automatyzację kompilacji w projektach C/C++.
Ułatwia zarządzanie kodem, oszczędza czas i pozwala utrzymać porządek w projekcie.
Kontener STL std::vector
Czym jest std::vector?
std::vector to sekwencyjny kontener z biblioteki STL, który przechowuje elementy w sposób ciągły w pamięci.
Umożliwia dynamiczne powiększanie i zmniejszanie rozmiaru podczas działania programu.
Dostarcza szybki dostęp do elementów przez indeks (operacja O(1)) oraz efektywne dodawanie na końcu (amortyzowane O(1)).
Najważniejsze cechy
* Elementy są przechowywane w kolejności dodania.
* Rozmiar może się zmieniać w trakcie działania programu.
* Zapewnia dostęp za pomocą operatora [] i metody at().
* Posiada bogaty zestaw metod do modyfikowania zawartości.
Najczęściej używane metody
* push_back(x) – dodaje element na końcu.
* pop_back() – usuwa ostatni element.
* size() – zwraca liczbę elementów.
* empty() – sprawdza, czy wektor jest pusty.
* clear() – usuwa wszystkie elementy.
* begin(), end() – iteratory pozwalające przechodzić po wektorze.
Przykład użycia
#include <vector>
#include <iostream>
int main() {
std::vector<int> liczby;
liczby.push_back(10);
liczby.push_back(20);
liczby.push_back(30);
for (size_t i = 0; i < liczby.size(); i++) {
std::cout << liczby[i] << std::endl;
}
return 0;
}
Kiedy używać std::vector?
* Gdy potrzebujesz dynamicznej tablicy.
* Gdy kluczowy jest szybki dostęp do elementów.
* Gdy dane często dodajesz na końcu kontenera.
* Gdy zależy Ci na prostocie i efektywności.
Zalety
* Bardzo szybki dostęp do elementów.
* Kompaktowe przechowywanie danych w pamięci.
* Prosta obsługa i szerokie wsparcie w STL.
Wady
* Wstawianie elementów w środku jest kosztowne (przesuwanie danych).
* Przealokowanie podczas powiększania może czasem kosztować więcej czasu.
Podsumowanie
std::vector to najczęściej używany kontener STL dzięki swojej wydajności, elastyczności i intuicyjności.
W większości przypadków stanowi zalecaną strukturę do przechowywania sekwencji danych w C++.