Avatar billede morw Nybegynder
26. marts 2003 - 15:07 Der er 10 kommentarer og
1 løsning

makefile - hvordan virker den?

Jeg har hentet lidt sovs fra min bog: http://www.acceleratedcpp.com/details/unix-source.tar.gz

Jeg er ved at prøve det der i cap4.

Jeg har brug for en der kan fortælle hvad der sker linie for linie i nedenstående:

> cat makefile
CXX = g++
CC = g++

all:    main1 main2 main3

Student_info.o: Student_info.cc Student_info.h

grade.o:  grade.cc grade.h median.h Student_info.h

main3.o:  main3.cc grade.h median.h Student_info.h

median.o:  median.cc median.h

main3:  main3.o grade.o median.o Student_info.o

test:  all
    ./main1 <../data/single_grade
    ./main2 <../data/single_grade
    ./main2 <../data/grades
    ./main3 <../data/grades

clobber:
    rm -f *.o *.exe core main1 main2 main3
>
Avatar billede arne_v Ekspert
26. marts 2003 - 15:14 #1
CXX = g++  # symbol CXX lig med g++ (GNU C++ compiler)
CC = g++    # symbol CC lig med g++ (GNU C++ compiler)


all:    main1 main2 main3  # hvis all skal buildes skal main1 og main2 og main3 buildes

Student_info.o: Student_info.cc Student_info.h # hvis Student_info.cc eller Student_info.h har ændret sig skal Student_info compiles

grade.o:  grade.cc grade.h median.h Student_info.h # samme

main3.o:  main3.cc grade.h median.h Student_info.h # samme


median.o:  median.cc median.h  # samme


main3:  main3.o grade.o median.o Student_info.o  # samme


test:  all # ved test skal main1+main2 køres med single_grade test data og main2+main3 med grades test data
    ./main1 <../data/single_grade
    ./main2 <../data/single_grade
    ./main2 <../data/grades
    ./main3 <../data/grades

clobber: # slet alle objekt og executable filer
    rm -f *.o *.exe core main1 main2 main3
Avatar billede arne_v Ekspert
26. marts 2003 - 15:16 #2
Hele ideen i make er at man definere hvilke input der bruges
til at lave et output.

Make checker så om nogle af inputtene er nyere end outputtet
og compiler/linker/whatever for at opdatere output, hvis det
er tilfældet.
Avatar billede morw Nybegynder
26. marts 2003 - 15:37 #3
Hvad er de .o filer?


Jeg forstår ikke hvorfor make3 har disse ekstra linier, i forhold til de andre to main-filer:

main3.o:  main3.cc grade.h median.h Student_info.h
main3:  main3.o grade.o median.o Student_info.o

Der er noget galt for jeg får ikke en main3 og testen går derfor i ged - her kommer lige mit output:

ALLE FILER
--------------
> ll
total 24
-rw-r--r--  1 mwinther  mwinther  818 Mar 26 14:24 Student_info.cc
-rw-r--r--  1 mwinther  mwinther  418 Mar 26 14:24 Student_info.h
-rw-r--r--  1 mwinther  mwinther  826 Mar 26 14:24 grade.cc
-rw-r--r--  1 mwinther  mwinther  243 Mar 26 14:24 grade.h
-rw-r--r--  1 mwinther  mwinther  2696 Mar 26 14:24 main1.cc
-rw-r--r--  1 mwinther  mwinther  3379 Mar 26 14:24 main2.cc
-rw-r--r--  1 mwinther  mwinther  1744 Mar 26 14:24 main3.cc
-rw-r--r--  1 mwinther  mwinther  447 Mar 26 15:31 makefile
-rw-r--r--  1 mwinther  mwinther  808 Mar 26 14:24 median.cc
-rw-r--r--  1 mwinther  mwinther  139 Mar 26 14:24 median.h

MAKE
----
> make
g++  -O -pipe  main1.cc  -o main1
g++  -O -pipe  main2.cc  -o main2
g++  -O -pipe  -c main3.cc
g++  -O -pipe  -c grade.cc
g++  -O -pipe  -c median.cc
g++  -O -pipe  -c Student_info.cc

TEST
----
>  make test
./main1 <../data/single_grade
Please enter your first name: Hello, harriet!
Please enter your midterm and final exam grades: Enter all your homework grades, followed by end-of-file: Your final grade is 90
./main2 <../data/single_grade
harriet 90
./main2 <../data/grades
Baker    67.2
Carpenter 82
Davis    75
Edwards  78.2
Fail1    58
Fail2    57
Franklin  66.6
Harris    92.4
Jones    77.2
Moo      100
Moore    79.4
Norman    72.8
Olson    82.8
Peerson  66.6
Russel    79.4
Smith    87.2
Thomas    95.6
Vaughn    87
Westerly  86.2
./main3 <../data/grades
./main3: not found
*** Error code 127

Stop in /usr/home/mwinther/acpp/chapter04.
>

Hvorfor er det at der ikke laves en main3?
Avatar billede arne_v Ekspert
26. marts 2003 - 15:44 #4
compileren oversætter fra .c/.cc/.cpp til .o
loaderen linker fra .o til executable (som ikk ehar nogen extension på Unix)

main3.o:  main3.cc grade.h median.h Student_info.h

hvis .cc eller en af de 2 .h filer den bruger er ændret så skal der gencompiles

main3:  main3.o grade.o median.o Student_info.o

hvis output fra compile af main3 eller grade eller median
eller Student_info har ændret sig skal der genloades/genlinkes
Avatar billede arne_v Ekspert
26. marts 2003 - 15:46 #5
Når det ikke virker med main3, så må der være en eller anden fejl
i makefile logikken.
Avatar billede morw Nybegynder
26. marts 2003 - 15:55 #6
Ja, det virker på redhat men ikke på min freebsd spand

2 sec, så kommer forskellen på hvad makefile gør på de 2 systemer
Avatar billede morw Nybegynder
26. marts 2003 - 16:01 #7
FreeBSD:

> make all
g++  -O -pipe  main1.cc  -o main1
g++  -O -pipe  main2.cc  -o main2
g++  -O -pipe  -c main3.cc
g++  -O -pipe  -c grade.cc
g++  -O -pipe  -c median.cc
g++  -O -pipe  -c Student_info.cc
>

RedHat:


[u-1@hooft chapter04]$ make all
g++    main1.cc  -o main1
g++    main2.cc  -o main2
g++    -c -o main3.o main3.cc
g++    -c -o grade.o grade.cc
g++    -c -o median.o median.cc
g++    -c -o Student_info.o Student_info.cc
g++  main3.o grade.o median.o Student_info.o  -o main3
[u-1@hooft chapter04]$

Det er altså sidste linie der mangler. Ved du hvad det skyldes? Går ud fra det er den måde systemet læser makefile på og ikke compiler version, idet jeg godt kan køre sidste linie fra RedHat på FreeBSD boksen.

Ellers kan du måske lige svare på hvad følgende gør:

-c
-O
-pipe
Avatar billede arne_v Ekspert
26. marts 2003 - 16:40 #8
-c betyder "compile only" (fordi der skal loades/linkes senere)
Avatar billede arne_v Ekspert
26. marts 2003 - 16:41 #9
Og filerne er *HELT* ens ?

Ikke bare tastet ens ind.
Avatar billede arne_v Ekspert
26. marts 2003 - 16:41 #10
Men ellers er jeg lidt på bar bund - jeg kender ikke forskellene
på RedHat og FreeBSD på det niveau.
Avatar billede morw Nybegynder
26. marts 2003 - 16:51 #11
Jeps, direkte uploaded via ftp.

Spørger lige på bsd maillisten
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester