Oikeissa ohjelmissa kaikkea koodia ei yleensä tehdä yhteen tiedostoon. Usein on myös käytössä header-tiedostoja, jotka sisältävät ohjelman tarvitsemia määritteitä. Hakemistossa on ohjelma, jonka koodi on tiedostoissa luku.c, main.c ja tulostus.c. Lisäksi ohjelmalla on määritteet sisältävä header-tiedosto headerit.h. Header-tiedoston käytöstä lisää: http://cs.stadia.fi/~luuma/c/t14-misc/esim14-3.txt Ohelma voidaan kääntää (varoitukset päällä) antamalla komento: gcc luku.c main.c tulostus.c -o ohjelma -Wall Ohjelman kääntäminen näin on turhan vaivalloista, eikä muutenkaan kovin järkevää. Antamalla yo. komennon, tapahtuu niin että koko ohjelma käännetään uudelleen. Pienissä ohjelmissa tämä on ihan ok, mutta ohjelmien kasvaessa ei koko koodin uudelleenkääntäminen jokaisen muutoksen jälkeen ole järkevää. Parempi ratkaisu on käyttää Unixin make-työkalua. Ohjelman käännöstä varten luodaan ns. Makefile eli tiedosto jonka nimi on Makefile [luuma@telinux1]$ cat Makefile ohjelma: main.o tulostus.o luku.o gcc main.o tulostus.o luku.o -o ohjelma main.o: main.c headerit.h gcc -c main.c tulostus.o: tulostus.c headerit.h gcc -c tulostus.c luku.o: luku.c headerit.h gcc -c luku.c [luuma@telinux1 esim14-4]$ Tiedosto sisältää ohjeet siitä miten koodi käännetään. Komento make suorittaa käännöksen noudattaen Makefilen ohjetta. Käännös tapahtuu antamalla käsky make: [luuma@telinux1]$ make gcc -c main.c gcc -c tulostus.c gcc -c luku.c gcc main.o tulostus.o luku.o -o ohjelma main.o(.text+0x28): In function `main': : the `gets' function is dangerous and should not be used. [luuma@telinux1 esim14-4]$ Ideana suuremman ohjelmistoprojektin käännöksessö on ensin kääntää kukin moduli ns. objektitiedostoksi. Tämä tapahtuu komennoilla gcc -c main.c gcc -c tulostus.c gcc -c luku.c Tuloksena on objektitiedostot main.o, tulostus.o ja luku.o Objektitiedostot linkitetään suoritettavaksi ohjelmaksi komennolla gcc main.o tulostus.o luku.o -o ohjelma Tuloksena on siis tiedosto ohjelma, joka voidaan suorittaa. Makefile sisältää ohjeet tälle käännösprosessille. Jos nyt muutetaan esim. tiedostoa luku.c, ei tarvita muuta kuin kääntää tämä tiedosto uudelleen, eli suorittaa gcc -c luku.c Tämän jälkeen suoritetaan linkitys gcc main.o tulostus.o luku.o -o ohjelma ja ohjelman päivitetty versio valmiina. Muuttumattomia koodimoduuleja main.c ja tulostus.c ei siis tarvinnut kääntää uudelleen. Ajansäästö suuressa projektissa voi olla huomattava. Makefile osaa hoitaa käännöksen automaattisesti siten, että ainoastaan tarpeelliset käännöksen vaiheet tehdään, eli tehdään koodiin mitä muutoksia tahansa, ohjelma käännetään aina antamalla komento make Komento kääntää koodista onjektitiedostoiksi ainoastaan muuttuneet osat ja linkittää objektitiedostot suoritettavaksi ohjelmaksi. Makefileä ja makea kannattaa käyttää aina, jos ohjelma koostuu useammasta kuin yhdestä c-tiedostosta. Makefileen on myös lisätty ns. clean-osa. Antamalla komento make clean saadaan poistettua hakemistosta kaikki käännösvaiheessa syntyneet .o-tiedostot. Aiheesta tarkemmin: http://liw.iki.fi/liw/texts/ohjelmointityokalut.html