Toon posts:

[C++] Makefile Linux/Solaris

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb onder windows een huiswerk opdracht gemaakt,
daarna heb ik een makefile geschreven voor linux.
Beide binaries doen het daarna prima.
Nu wil ik het ook onder Solaris compileren,
maar ik krijg error die ik niet snap ( de reden, niet de error ):
code:
1
make: Fatal error in reader: Makefile, line 13: Unexpected end of line seen

Regel 13 is de lege regel tussen CPPSOURCES en opdracht3:.

Als ik vervolgens de enters uit de makefile haal krijg ik de volgende error:
('ake is geen typo, en snap ik helemaal niet)
code:
1
'ake: Fatal error: Don't know how to make target `opdracht3Framework.cpp


De makefile ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Makefile for computer graphics assigment 3
CC      = g++
COMPILEFLAGS    =
LINKFLAGS   =
CCFLAGS     = -O2
CPPFLAGS    = -O2
MKDEPEND    = -MM
INCDIR      = -I/home/rshulako/include -I/usr/include/
LIBDIR      = -L/usr/X/lib -L/home/rshulako/lib -L/usr/local/lib/ -L/usr/X11R6/lib/
LIB             = -lm -lfltk -lfltk_gl -lGLU -lGL -lX11 -lXext -lXmu -lXi -lnsl
CPPSOURCES = opdracht3Framework.cpp polygoon.cpp main.cpp

opdracht3: opdracht3Framework.o main.o polygoon.o
    $(CC) $(CPPFLAGS) $(LIBDIR) $(LINKFLAGS) $(LIB) -o opdracht3 opdracht3Framework.o main.o polygoon.o

main.o: opdracht3Framework.h polygoon.h main.cpp 
    $(CC) $(INCDIR) $(CPPFLAGS) $(COMPILEFLAGS) -c main.cpp

opdracht3Framework.o: opdracht3Framework.cpp
    $(CC) $(INCDIR) $(CPPFLAGS) $(COMPILEFLAGS) -c opdracht3Framework.cpp

polygoon.o: opdracht3Framework.h polygoon.cpp
    $(CC) $(INCDIR) $(CPPFLAGS) $(COMPILEFLAGS) -c polygoon.cpp

clean: 
    rm -f opdracht3 *.o


Zover ik kon vinden moet een Makefile onder solaris het gewoon moeten doen.
Als iemand snapt waarom ik zo hard faal, zou ik wat hulp erg waarderen.

Geflame op mijn Makefile wordt ik ook erg blij van, want ik wil graag leren hoe makefiles beter geschreven kunnen worden.

  • ajslaghu
  • Registratie: Oktober 2000
  • Laatst online: 23-08 12:20
Probeer eens de tabs in de file te vervangen door linux tabs (harde). Zet tevens een aantal regels blank onder in de file. vervang tevens de enters door linux enters.

dus

item:
<tav> tekst [enter]

iemt2:
idem....


->Nu pas de file sluiten

Als je het absurde aanneemt, kan je het tegenover gestelde bewijzen ??


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Ik denk dat je Makefile nog DOS end-of-lines bevat, dus een CRLF, terwijl Linux/Solaris alleen een LF gebruikt. De extra CR's die in je Makefile zitten zorgen voor de verwarring bij make.

Daarom staat er ook 'ake in plaats van make, na opdracht3Framework.cpp staat een CR, daardoor gaat de cursor naar het begin van de regel, en daar wordt de afsluitende ' geprint.

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Verwijderd schreef op 11 March 2003 @ 23:33:
... ik wil graag leren hoe makefiles beter geschreven kunnen worden.
Oke, voor compiler-flags wordt normaalgesproken alleen "CFLAGS" gebruikt voor C compilaties, en "CXXFLAGS" voor C++. "CPPFLAGS" wordt gebruikt voor preprocessor-flags, dus voornamelijk eventuele preprocessor-defines zoals "-DNDEBUG " e.d.

Voor de stap van objectfiles naar een executable ("linken") gebruikt men meestal de opzet:
$(LD) $(LDFLAGS) $(LIBDIR) -o target objectfile1.o objectfile2.o objectfile3.o $(LIBS)

Waarbij LD naar de linker wijst (bijvoorbeeld gcc of ld) en LDFLAGS de linkflaggen zijn ("-s" "-pg" e.d.) Preprocessor-flags hebben in elk geval geen nut tijdens het linken.

Ik weet echter niet of onder solaris dezelfde make wordt gebruikt als onder linux, Gnu make kan namelijk -zoals je al gemerkt hebt- wel omgaan met DOS end-of-line karakters. De make die je gebruikt onder solaris kan dit blijkbaar niet, en is dus waarschijnlijk geen gnu make. Deze make zou dan wel eens op bepaalde vlakken een hele ander syntax nodig kunnen hebben om hetzelfde te bereiken...

/me overigens heeft dit topic niets met C++ te maken, allleen maar met "make"

Verwijderd

Topicstarter
Het probleem was inderdaad de \r\n onder dos, en \n onder solaris!
Ik heb het als volgt opgelost:
code:
1
perl -pae 's/\r\n/\n/' MakefileDos > Makefile


Later kwam ik achter een handigere oplossing:
code:
1
dos2unix -ascii MakefileDos > Makefile


Ik zal de info proberen te onthouden als ik weer makefiles ga maken.

Bedankt voor de hulp allemaal!