2009-08-14 14 views
6

Ecco le mie due domande:organizzare progetto e specificare la directory per i file oggetto in Makefile

  1. ora sto imparando a gestire il mio codice con CVS, e voglio solo fare un repository per i miei file C++, Solo script Makefile e bash e python, non i file oggetto e gli eseguibili. Così ho creato diverse sottodirectory nella directory del mio progetto: src, bin, script, risultati e dati. Ho messo i file C++ e Makefile sotto ~/myproject/src, bash e python scripts sotto ~/myproject/scripts e object ed eseguibili sotto ~/myproject/bin. Spero solo che i file sotto src e gli script vengano aggiornati tramite CVS. Mi chiedo come voi ragazzi organizzate i vostri progetti? Spero solo di seguire alcune buone abitudini

  2. Da quando ho messo i miei file C++ e Makefile in ~/myproject/src e gli oggetti ed i file eseguibili in ~/myproject/bin, devo specificare le directory in Makefile. Ecco quello che sto facendo

Makefile:

... 
BIN_DIR=/home/myproject/bin/ 

all: $(BIN_DIR)myexecutable TAGS 

TAGS: *.cc *.h 
    etags --members --declarations -l c++ *.cc *.h 

$(BIN_DIR)myexecutable: $(BIN_DIR)myobject.o 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) 

Makefile.depend: *.h *.cc Makefile 
    $(CXX) -M $(CXXFLAGS) *.cc > Makefile.depend 

clean: 
    \rm -f $(BIN_DIR)myexecutable $(BIN_DIR)*.o Makefile.depend TAGS` 

Tuttavia, questo darà errore

make: *** Nessuna regola per rendere bersaglio /home/myproject/bin/myobject.o', needed by/home/myproject/bin/myexecutable'.

Come specificare una directory diversa per oggetti e file eseguibili da file C++ in Makefile?

Grazie e saluti!

+1

Perfavore indentate il vostro estratto dal Makefile di quattro spazi. Ciò gli darà la giusta formattazione e l'evidenziazione della sintassi. –

+0

Sembra che ci sia un bug da qualche parte che impedisce di inserire il codice dopo una lista. Ho aggiunto "Makefile:" come soluzione. – AProgrammer

risposta

2
  1. È possibile mantenere i file in directory diverse, se volete, ma che non è necessario. Aggiungi un file o una directory al repository CVS una volta e CVS lo manterrà per un tempo indefinito. Da quel momento in poi potrai aggiornarlo, controllarlo, qualunque cosa. Se non si aggiunge un file oggetto al repository, CVS non lo toccherà. Se vuoi aggiungere un intero albero di directory e hai l'abitudine di tenere gli oggetti lì, basta fare pulizia prima di farlo.

  2. Make è uno strumento meraviglioso, ma presenta alcuni difetti evidenti. Quello che stai descrivendo è uno dei problemi classici: Make è bravo a usare una fonte per fare qualcosa qui, ma non viceversa. Ecco un paio di modi per fare ciò che stai cercando di fare.

A) Run fare nella vostra directory binaria:

 
    ... 
    all: myexecutable TAGS 

    myexecutable: myobject.o 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) 

    VPATH = /home/myproject/src 
    ... 

cd ~/myproject/bin
make -f ../src/makefile

B) Mettete gli oggetti nella directory bin in base alla forza bruta:

 
    $(BIN_DIR)%.o: %.cc 
     $(CXX) $(CXXFLAGS) -c -o [email protected] $^ 

Questo ti darà un problema con Makefile.depend, che puoi affrontare in diversi modi.

C) Altre tecniche di produzione avanzate. Probabilmente non dovresti provarlo ancora.

+0

Se si è adottato l'approccio B), come affronterebbe i problemi con le dipendenze del Makefile? – frankster

+0

@frankster, probabilmente modificherei il comando 'Makefile.depend' per anteporre' $ (BIN_DIR) 'ai nomi dei file oggetto. Farebbe un po 'di sed. – Beta

2
  1. La struttura della directory sembra ragionevole.

  2. vorrei fare una regola esplicita per l'esecuzione del compilatore, come

TARGET_DIR=bin 
SRC_DIR=src 
CXX=g++ 
CXXFLAGS= 
ETC= 

OBJS=$(TARGET_DIR)/test.o 

all: $(OBJS) 

$(TARGET_DIR)/%.o: $(SRC_DIR)/%.cc 
     $(CXX) -c -o [email protected] $(CXXFLAGS) $(ETC) $< 
+0

Gradirei un commento sul downvote, in modo che io possa migliorare me stesso :) –

+0

Non so chi ti ha dato il voto, non io. :) Se si hanno molti file .cc, specificare una regola per ogni file oggetto è noioso, non è vero? – Tim

+0

La regola è generica, quindi si applica a qualsiasi file .cc. Ho aggiornato l'esempio del codice Makefile con un elenco di oggetti di destinazione. Basta specificare ulteriori file .o qui e verranno compilati con la stessa regola. –

-5

Perché non andare per Eclipse, che è molto popolare e pratico per la gestione di progetti di grandi dimensioni. Puoi creare un nuovo progetto in eclissi, importare il codice di esportazione nel progetto da altri progetti, fare il controllo della versione anche per te ecc. Non c'è bisogno di scrivere i tuoi file make, eclipse lo fa per te con le tue preferenze menzionate nella GUI. Se sei coinvolto in un progetto C++, basta installare il plugin CDT su eclipse e il gioco è fatto.

+0

Non risponde affatto alla domanda. – murrekatt

0

Utilizzare automake e autoconf per la costruzione del progetto.

Per quanto riguarda la struttura dei file, basta guardare qualsiasi grande applicazione C++ open source. Qualsiasi applicazione KDE andrà bene per quella materia. Se trovi un'applicazione che usa C++ e Python ancora meglio.

8

Se vuoi imparare a fare, lo GNU make manual è molto buono, sia come riferimento che come tutorial. Si potrebbe voler prendere in considerazione l'utilizzo del comando brevettato.Quello che segue è una versione abbattuto di uno dei miei makefile che lo utilizza:

OUT = bin/csvfix.exe 
CC = g++ 
IDIR = inc 
ODIR = obj 
SDIR = src 
INC = -Iinc -I../alib/inc 
LIBS = ../alib/lib/alib.a -lodbc32 

_OBJS = csved_atable.o \ 
     csved_case.o \ 
     csved_cli.o \ 
     csved_command.o \ 
     csved_date.o \ 

OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS)) 

$(ODIR)/%.o: $(SDIR)/%.cpp 
    $(CC) -c $(INC) -o [email protected] $< $(CFLAGS) 

$(OUT): $(OBJS) 
    $(CC) -o [email protected] $^ $(CFLAGS) $(LIBS) 
    strip $(OUT) 

clean: 
    rm -f $(ODIR)/*.o $(OUT) 
Problemi correlati