====== 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