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 <stdio.h> #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.
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