/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
singleton og makefile
Fra : kim


Dato : 18-04-03 09:25

Jeg vil gerne have lavet en klasse som implementerer singleton design
pattern. Men jeg kan simpelthen ikke få det til at compile når jeg bruger
en makefil. Hvis jeg blot compiler det manuelt fungerer det dog fint.

Jeg vedlægger filerne i håb om at en eller anden kan gennemskue det. (Jeg
compiler på en rødhætte 7.3 med g++)
*********
Makefile:
*********
CPP = g++
OFLAG = -Wall -o run

all: myProg

test.o: test.cpp
   $(CPP) -c test.cpp
Scheduler.o: Scheduler.cpp Scheduler.h
   $(CPP) -c Scheduler.cpp
myProg: test.o Scheduler.o
   $(CPP) test.o Scheduler.o
clean:
   rm *.o run

***********
test.cpp
***********
#include "Scheduler.h"

int main(){
Scheduler* sc= Scheduler::inst();
}
***********
Scheduler.h
***********
#ifndef SCHEDULER_H
#define SCHEDULER_H

#include <stdio.h>

class Scheduler {
public:
static Scheduler* globalObject;
static Scheduler* inst(){
if (! globalObject)
globalObject= new Scheduler;
return globalObject;
}

};

Scheduler *Scheduler ::globalObject = NULL;

#endif
***********
Scheduler.cpp
***********
#include "Scheduler.h"


Mvh
Kim Bendtsen

 
 
Thomas Thorsen [9000~ (18-04-2003)
Kommentar
Fra : Thomas Thorsen [9000~


Dato : 18-04-03 14:36

> *********
> Makefile:
> *********
> CPP = g++
> OFLAG = -Wall -o run
>
> all: myProg
>
> test.o: test.cpp
> $(CPP) -c test.cpp
> Scheduler.o: Scheduler.cpp Scheduler.h
> $(CPP) -c Scheduler.cpp
> myProg: test.o Scheduler.o
> $(CPP) test.o Scheduler.o
> clean:
> rm *.o run

Du skal indsætte et tabulatortegn foran linierne der begynder med $(CPP) og
foran linien der begynder med rm.

Det er en sær Makefile-regel, men sådan er det...

-Thomas



kim (18-04-2003)
Kommentar
Fra : kim


Dato : 18-04-03 15:06

> Du skal indsætte et tabulatortegn foran linierne der begynder med $(CPP)
> og foran linien der begynder med rm.
>
> Det er en sær Makefile-regel, men sådan er det...

tabulator tegnet er forsvundet i copy-pasten. Den er i min
Makefile i forvejen. Så der er nok noget andet som fejler.. ?

Mhv
Kim

Michael Wojciechowsk~ (18-04-2003)
Kommentar
Fra : Michael Wojciechowsk~


Dato : 18-04-03 17:00

On Fri, 18 Apr 2003 10:25:19 +0200, kim <kim@kjsdlkfjsdf.dk> wrote:

> Jeg vedlægger filerne i håb om at en eller anden kan gennemskue
> det. (Jeg compiler på en rødhætte 7.3 med g++)

Pladcer "Scheduler *Scheduler ::globalObject = NULL;" i Scheduler.cpp.

Din makefile ser ud til at virke.

--
Michael Wojciechowski

One must suffer before enlightenment.

Kim Bendtsen (18-04-2003)
Kommentar
Fra : Kim Bendtsen


Dato : 18-04-03 18:08

Den Fri, 18 Apr 2003 16:00:03 +0000, skrev Michael Wojciechowski:

> On Fri, 18 Apr 2003 10:25:19 +0200, kim <kim@kjsdlkfjsdf.dk> wrote:
>
>> Jeg vedlægger filerne i håb om at en eller anden kan gennemskue
>> det. (Jeg compiler på en rødhætte 7.3 med g++)
>
> Pladcer "Scheduler *Scheduler ::globalObject = NULL;" i Scheduler.cpp.

Af _alle_ de ting jeg har prøvet, og så er dette det eneste der skal
til...

Tak for svaret! :)
Mvh
Kim

René Allan Larsen (18-04-2003)
Kommentar
Fra : René Allan Larsen


Dato : 18-04-03 18:48

In article <pan.2003.04.18.08.25.18.421429.7358@kjsdlkfjsdf.dk>, Kim wrote:
>
> Jeg vil gerne have lavet en klasse som implementerer singleton design
> pattern. Men jeg kan simpelthen ikke få det til at compile når jeg bruger
> en makefil. Hvis jeg blot compiler det manuelt fungerer det dog fint.

Hvilke fejl får du?

> Jeg vedlægger filerne i håb om at en eller anden kan gennemskue det. (Jeg
> compiler på en rødhætte 7.3 med g++)

Hvor i makefilen bruger du OFLAG? OFLAG er SVJV ikke en standard
make-variabel og bruges derfor kun, hvis du selv bruger den i en regel

Prøv at slette/udkommentere de to første linjer med CPP og OFLAG fra
makefilen og kør "make -n -p | less". Så kan du se standard reglerne (og
dine regler) som "make" bruger. Kør også "info make" og se under "implicit
rules" (ihvertfald under "GNU make").

Husker du at bruge et tabulator tegn (og *ikke* mellemrum) som det første
tegn på linjerne med kommandoer?

Her er en minimal makefile, som oversætter programmet (med mindre der er
fejl i dit program):

CXXFLAGS = -Wall # 'g++' flag
LDFLAGS = -Wall # 'linker' flag (nødvendigt?)
all: run
run: test.o Scheduler.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
clean:
rm *.o run

Make kan selv finde ud af at lave "X.o" ud fra "X.cpp", så det behøver du
ikke at beskrive.

Kommandoen "$(LINK.o) ..." er kun skrevet, fordi din "main()" ikke ligger i
"run.cpp" (kommandoen er faktisk kopieret direkte fra GNU make's indbyggede
regler). Hvis din "main()" *havde* ligget i "run.cpp", havde makefilen set
sådan ud:

CXXFLAGS = -Wall # 'g++' flag
LDFLAGS = -Wall # 'linker' flag
all: run
run: Scheduler.o
clean:
rm *.o run

Simpelt, ikke ;)

Jeg har ikke kommenteret dit program, da jeg ikke kender så meget til C++.

MVH, René


Kim Bendtsen (18-04-2003)
Kommentar
Fra : Kim Bendtsen


Dato : 18-04-03 19:30

Den Fri, 18 Apr 2003 19:48:12 +0200, skrev René Allan Larsen:

> In article <pan.2003.04.18.08.25.18.421429.7358@kjsdlkfjsdf.dk>, Kim wrote:
>>
>> Jeg vil gerne have lavet en klasse som implementerer singleton design
>> pattern. Men jeg kan simpelthen ikke få det til at compile når jeg bruger
>> en makefil. Hvis jeg blot compiler det manuelt fungerer det dog fint.
>
> Hvilke fejl får du?
Jeg fik nogle linker fejl hvilket jeg nok burde have inkluderet..


> Hvor i makefilen bruger du OFLAG? OFLAG er SVJV ikke en standard
> make-variabel og bruges derfor kun, hvis du selv bruger den i en regel
Jeg glemte at fjerne OFLAG da jeg kogede mit kode ned til essencen af
problemet.. Men du har helt ret i at OFLAG ikke benyttes.. :)


> Prøv at slette/udkommentere de to første linjer med CPP og OFLAG fra
> makefilen og kør "make -n -p | less". Så kan du se standard reglerne (og
> dine regler) som "make" bruger. Kør også "info make" og se under "implicit
> rules" (ihvertfald under "GNU make").
Puha der meget.. Kan man bruge det til at debugge sin Makefile eller er
det bare godt at vide

> CXXFLAGS = -Wall # 'g++' flag
> LDFLAGS = -Wall # 'linker' flag (nødvendigt?)
> all: run
> run: test.o Scheduler.o
> $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
> clean:
> rm *.o run
>
Mangler man ikke at fortælle at det c++ filer?
: udefineret reference til "operator new(unsigned)"


> Kommandoen "$(LINK.o) ..." er kun skrevet, fordi din "main()" ikke ligger i
> "run.cpp" (kommandoen er faktisk kopieret direkte fra GNU make's indbyggede
> regler). Hvis din "main()" *havde* ligget i "run.cpp", havde makefilen set
> sådan ud:
>
> CXXFLAGS = -Wall # 'g++' flag
> LDFLAGS = -Wall # 'linker' flag
> all: run
> run: Scheduler.o
> clean:
> rm *.o run
>
> Simpelt, ikke ;)
Når man ved hvordan.. :)

Nu skal du selvfølgelig ikke lave Makefilen til projektet (men du er
velkommen ;) ) Men hvordan vil man udforme en makefil hvor mange af fileren
ligger i underkataloger. Mit main program ligger i 'roden'. Scheduler ligger
i et bib 'scheduler', en masse ting i 'utils'. Er der en smart måde til
det? Jeg havde kigget på autoconf/scan/make, men indtil videre har jeg
opgivet det lidt igen.


Mvh
Kim

René Allan Larsen (22-04-2003)
Kommentar
Fra : René Allan Larsen


Dato : 22-04-03 10:31

In article <pan.2003.04.18.18.29.52.412283@REMOVE_THIScontrol.auc.dk>, Kim
Bendtsen wrote:
>
> Den Fri, 18 Apr 2003 19:48:12 +0200, skrev René Allan Larsen:
>
> > Prøv at slette/udkommentere de to første linjer med CPP og OFLAG fra
> > makefilen og kør "make -n -p | less". Så kan du se standard reglerne (og
> > dine regler) som "make" bruger. Kør også "info make" og se under "implicit
> > rules" (ihvertfald under "GNU make").
> Puha der meget.. Kan man bruge det til at debugge sin Makefile eller er
> det bare godt at vide

Jo men til debugging er "make -d | less" bedre. Prøv den kommando, nu hvor du har
et program, der kan oversættes. Så ser du hvad make egentlig prøver, når den
oversætter et program.

> > CXXFLAGS = -Wall # 'g++' flag
> > LDFLAGS = -Wall # 'linker' flag (nødvendigt?)
> > all: run
> > run: test.o Scheduler.o
> > $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
> > clean:
> > rm *.o run
> >
> Mangler man ikke at fortælle at det c++ filer?

Nej. "make" har en masse regler, som den prøver at tilfredsstille. Nogle af disse
regler er hvordan man laver en .o fil ud fra kildetekst. Prøv at lede efter de
linjer i udskriften fra "make -n -p | less", som indeholder "%.o:".

> Nu skal du selvfølgelig ikke lave Makefilen til projektet (men du er
> velkommen ;) ) Men hvordan vil man udforme en makefil hvor mange af fileren
> ligger i underkataloger. Mit main program ligger i 'roden'. Scheduler ligger
> i et bib 'scheduler', en masse ting i 'utils'. Er der en smart måde til
> det?

Der er to forskellige måder: "rekursiv make" og "total make". Ved "rekursiv make"
laver du en makefile i hvert underkatalog. Ved "total make" indeholder makefilen
i 'roden' *alle* kommandoerne.

Ved "rekursiv make" kommer makefilen i roden til at se nogenlunde sådan ud:

CXXFLAGS = -Wall
LDFLAGS = -Wall
dirs=scheduler utils
_clean=
all: $(dirs) run
$(dirs):
$(MAKE) -C $@ $(_clean)
run: test.o Scheduler.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
clean:
rm *.o run
$(MAKE) _clean=clean $(dirs)

(jeg bruger variablen '_clean' til at få målet 'clean' til at virke efter
hensigten)

En "total make" kunne se sådan ud:

CXXFLAGS = -Wall
LDFLAGS = -Wall
all: run
scheduler/Scheduler.o: scheduler/Scheduler.cpp
run: test.o scheduler/Scheduler.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
clean:
rm *.o scheduler/*.o run

Jeg er ikke sikker på at de ovenstående eksempler virker, men de viser hensigten.

Du can endda bruge funktionen "wildcard" til at give dig alle .cpp filer i
underkataloget 'scheduler' ("src=$(wildcard scheduler/*.cpp)"). Så kunne du bruge
følgende i din makefile:

src_scheduler=$(wildcard scheduler/*.cpp)
...
scheduler/%.o: scheduler/%.cpp
run: test.o $(src_scheduler:.cpp=.o)

> Jeg havde kigget på autoconf/scan/make, men indtil videre har jeg
> opgivet det lidt igen.

Jeg er selv interesseret i autoconf/scan/make, men det ser meget kompliceret ud.
"make" er svær nok at finde ud af ;)

MVH, René


Michael Wojciechowsk~ (22-04-2003)
Kommentar
Fra : Michael Wojciechowsk~


Dato : 22-04-03 11:00

On Tue, 22 Apr 2003 11:30:31 +0200, René Allan Larsen
<rene.larsen@spamfilter.dk> wrote:

>> Jeg havde kigget på autoconf/scan/make, men indtil videre har jeg
>> opgivet det lidt igen.

> Jeg er selv interesseret i autoconf/scan/make, men det ser meget
> kompliceret ud. "make" er svær nok at finde ud af ;)

Jeg fandt de fleste oplysninger ang. autoconf og automake jeg havde
brug for i denne bog:
<http://sources.redhat.com/autobook/autobook/autobook_toc.html#SEC_Contents>

Jeg synes efterhånden, at brug af disse værktøjer gør det nemmere at
koncentere sig om at udvikle, da jeg slipper for at skrive
komplicerede makefiles. ;)

--
Michael Wojciechowski

One must suffer before enlightenment.

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408193
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste