Podział programu na pliki źródłowe i 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)

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

  1. tworzymy i zapisujemy nowy projekt
    Borland C++ Builder: File→New→Other→Console Wizard
    Visual Studio C++: File→New→Project→Win32→Win32 Console Application
  2. 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
  3. kompilacja
    Borland C++ Builder: Project→Make Project (Ctrl+F9)
    Visual Studio C++: Build→Build Solution (F6)
  4. 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