Toon posts:

[C] problemen met make-file

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met het maken van een zgn. make-file onder C.
Het zit zo: ik heb 3 c-bestanden, laten we deze respectievelijk:

- bestandA.c en bestandA.h
- bestandB.c en bestandB.h (bestandB.c include ook bestandA.h)
- bestandC.c (bestandC.c include bestandA.h en bestandB.h

Ik wil een executable hiervan maken

mijn make-file ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
program: bestandA.o bestandB.o bestandC.o
    gcc bestandA.o bestandB.o bestandC.o -o program

bestandA.o: bestandA.c bestandA.h
    gcc -c bestandA.c

bestandB.o: bestandB.c bestandB.h
    gcc -c bestandB.c
    
bestandC.o: bestandC.c
    gcc -c bestandC.c
    
clean: rm *.o

het maken van de o-files gaat prima. Maar bij het commando "make program"
loop ik vast en krijg de melding: No rule to make target 'program', stop.

Ik heb echt van alles geprobeerd , heb talloze sites nagelopen voor voorbeelden van make-files en ze lijken vrijwel hetzelfde qua syntax als die ik hierboven beschrijf. De makefile heet gewoon makefile(.txt)

Kan iemand mij helpen? ik programmeer onder windowsXP met de DJGPP compiler.

En is het 'clean'-commando zo juist? Want deze kan ik zo ook niet testen :)

Alvast bedankt! :)

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

zet program onder bestandA-C, en clean moet worden:
code:
1
2
clean:
        @rm *.o

maar dan met een tab ipv 8 spaties.

edit:
btw, het is aan te raden gebruik te maken van variables, dus:
code:
1
2
3
4
5
CC=gcc
CFLAGS=-g -O2 -Wall

foo:
        $(CC) $(CFLAGS) foo.c -o foo


zo kun je gemakkelijk compiler args aanpassen en dergelijke.

[ Voor 47% gewijzigd door CyBeR op 22-09-2003 19:34 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

Die bestand[ABC].o kun je vervangen door:

code:
1
2
.c.o:
        $(CC) -c '$<'


Daarna kun je een lijst van object names maken (om CyBeR na te praten):

code:
1
OBJECTS=bestandA.o bestandB,o bestandC.o


En dan wordt je uiteindelijke Makefile (met wat gepruts):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
OBJECTS=bestandA.o bestandB.o bestandC.o
APP=bestand

RM=rm -f
CC=gcc
COMPILE=$(CC) -O2 -g -Wall -c
LINK=$(CC)

clean:
        @$(RM) $(OBJECTS)

.c.o:
        $(COMPILE) '$<'

all: $(OBJECTS)
        $(LINK) $(OBJECTS) -o $(APP)


(Note: "all" is de default target, dus "make" zal "make all" aanroepen).

Ziet er een stuk leesbaarder uit. ;). Volgende stap is om autotools (automake, autoconf) te gebruiken, etc. :). Zie http://www.gnu.org/ voor documentatie over al dit.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Op de Universiteit Utrecht loopt op dit moment een cursus Software Engineering waar onder andere make/automake/autoconf ter sprake komt. De slides voor make kunnen handig zijn voor je:
http://www.cs.uu.nl/docs/...lides/SWE03-SCM-Build.pdf

Alle slides kan je hier vinden:
http://www.cs.uu.nl/groups/ST/twiki/bin/view/Swe/Slides

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Bedankt allemaal voor jullie antwoorden, ik heb nu ook gebruik gemaakt van variables, en het grote probleem waar ik mee zat heb ik ook opgelost. Wat was het geval: de makefile had door mn editor de extensie .txt meegekregen, en ja, dan kan de compiler zoeken wat hij wilt, makefile (zonder extensie) vind hij nooit :) . Nu is het opgelost!

bedankt voor jullie hulp!

Verwijderd

offtopic:
mbravenboer, je schijnt begeleider te zijn van de projecten van een vriend van me, heb je ICQ en dergelijke? :).
Pagina: 1