====== Podział programu na pliki źródłowe i nagłówkowe====== ===== Pliki nagłówkowe ===== Przykład podziału programu na pliki nagłówkowe i źródłowe: ** silnia.c ** #include #include "fmat.h" int main() { int liczba,s; printf("Podaj liczbe: "); scanf("%d",&liczba); s = silnia(liczba); printf("Silnia z %d wynosi %d\n",liczba,s); return 0; } ** fmat.h ** #ifndef FMAT_H #define FMAT_H int silnia(int n); float potega(float podstawa,int wykladnik); #endif ** fmat.c ** #include "fmat.h" int silnia(int n) { int i=2, s=1; while( i < n+1 ) { s = s * i; i = i + 1; } return s; } **Uwaga:** kompilacja przeprowadzana jest **tylko** na plikach źródłowych (''*.c''), więc kompilacja powyższego programu w Linuksie wygląda tak: cc fmat.c silnia.c -o silnia ** Ćwiczenia ** * podziel źródło programu z tablicami (z poprzednich zajęć) na trzy pliki: ''**tab.c**'' (tu umieść definicje funkcji), ''**prog.c**'' (tu umieść funkcję ''main()'') i ''**tab.h**'' (plik nagłówkowy z deklaracjami funkcji zdefiniowanych w pliku ''tab.c'') * za pomocą dyrektywy ''**define**'' zdefiniuj stałą określającą wielkość tablicy * dodaj do programu funkcję ''**odwroc**'', która odwróci kolejność elementów w tablicy liczb rzeczywistych, umieść deklarację funkcji w odpowiednim pliku nagłówkowym a definicję w pliku źródłowym * dodaj do programu funkcję ''**maxind**'', która dla danej tablicy liczb rzeczywistych zwraca indeks (pozycję w tablicy) elementu o największej wartości * napisz funkcję sortującą zawartość tablicy za pomocą algorytmu sortaowania przez wstawianie (korzystaj z funkcę ''maxind'') ===== Kompilacja kodu źródłowego z środowisku UNIX/Linux ===== Kompilator ''cc'' (''gcc'') cc [-Ikatalog] [-Lkatalog] [-o nazwa] źródło.c ... [-lbiblioteka ...] -I katalog z plikami nagłówkowymi\\ -L katalog z bibliotekami\\ -l nazwa biblioteki, np -lm to biblioteka matematyczna\\ \\ W Linuksie pliki nagłówkowe znajdują sie w katalogu ''/usr/include/'', biblioteki w katalogach ''/lib/'', ''/usr/lib''. \\ {{zajecia:jpr2008_1:kompilacja_c.gif|}} \\ Preprocesor cc -E prog.c | less Kompilacja (powstają pliki obiektowe *.o, kompilator Borland *.obj) cc -c prog.c tab.c Linkowanie ld -lc tab.o prog.o -o prog // nie działa, dlaczego? cc tab.o prog.o -o prog Uruchomienie ./prog Dodatkowe narzędzia: * **ldd** wyświetla zależności bibliotek ldd prog * **nm** wyświetla listę symboli z pliku obiektowego (oznaczenia U - symbol niezdefiniowany, T - definicja znajduje się w pliku, więcej w dokumentacji) nm tab.o * **objdump** wyświetla informacje z plików obiektowych dekompilacja programu objdump -D tab.o lista symboli z pliku obiektowego (podobnie do ''nm'') objdump -t tab.o * **readelf** wyświetla informacje o plikach obiektowych w formacie ''elf'' readelf -a tab.o ====== Kompilacja w środowisku Windows ====== ==== Linia komend ==== * Cygwin, kompilator gcc, cc * Borland C++, kompilator bcc32 (np. "C:\Program Files\Borland\CBuilder6\Bin\bcc32.exe", warto dodać do zmiennej ''PATH'') Składnia podobna do ''gcc'' jednak istotna jest kolejność opcji bcc32 [-Ikatalog] [-Lkatalog] [-enazwa.exe] źródło.c ... [biblioteka.lib ...] Przykład bcc32 -eprogram.exe tab.c prog.c * Microsoft Visual Studio, kompilator ''lc'' (np.: "C:\Program Files\Microsoft Visual Studio 8\VC\bin\lc.exe" ) Składnia cl [/Fe"nazwa_pliku.exe"] źródło.c ... [/link biblioteki] ==== IDE ==== - tworzymy i zapisujemy nowy projekt \\ ''Borland C++ Builder:'' File->New->Other->Console Wizard \\ ''Visual Studio C++:'' File->New->Project->Win32->Win32 Console Application - dodajemy pliki źródłowe i nagłówkowe do projektu (lub usuwamy zbędne pliki)\\ ''Borland C++ Builder:'' Project->Add To Project \\ ''Visual Studio C++:'' Project->Add Existing Item - kompilacja \\ ''Borland C++ Builder:'' Project->Make Project (Ctrl+F9) \\ ''Visual Studio C++:'' Build->Build Solution (F6) - uruchomienie \\ ''Borland C++ Builder:'' Run->Run (F9) \\ ''Visual Studio C++:'' Debug->Start Debugging (F5) Uwaga: konsola w której wyświetlane są wyniki działania programu zamknie się automatycznie po wykonaniu programu ** Ćwiczenia ** * skompiluj i uruchom program z ostatniego zadania w jednym z programów IDE * zapoznaj się z pomocą oferowaną przez dane środowisko (F1) * zapoznaj się z działaniem debbugera, spróbuj prześledzić działanie programu krok po kroku * umieść kilka błędów w kodzie i zobacz jak zostaną one wykryte przez kompilator * korzystając ze środowiska IDE dopisz do programu z tablicami (z poprzednich zajęć) kolejną funkcję, która za pomocą funkcji ''**maxind**'' (z ćwiczeń powyżej) posortuje tablicę liczb rzeczywistych