2010-07-08 21 views
97

Ho appena ereditato del codice C++ che è stato scritto male con un file cpp che conteneva il main e una serie di altre funzioni. Ci sono anche i file .h che contengono classi e le loro definizioni di funzione.Utilizzo di G ++ per compilare più file .cpp e .h

Fino ad ora il programma è stato compilato utilizzando il comando g++ main.cpp. Ora che ho separato le classi per i file .h e .cpp ho bisogno di usare un makefile o posso ancora usare il comando g++ main.cpp?

risposta

135

elenca tutti gli altri file cpp dopo main.cpp.

cioè

g++ main.cpp other.cpp etc.cpp 

e così via.

Oppure puoi compilarli tutti individualmente. Quindi colleghi tutti i file ".o" risultanti insieme.

+89

Si può anche fare 'g ++ * .cpp -o output' – rubenvb

+6

È comunque una cattiva pratica? Mi piacerebbe usare questo nel mio makefile. –

+6

@gabriel_vincent, non è necessariamente una cattiva pratica, ma significherà che la modifica di un file in un progetto di centinaia farà sì che il compilatore ripristini tutto il lavoro per tutti i file. La compilazione separata consente la compilazione incrementale. –

7

È comunque possibile utilizzare g ++ direttamente se si desidera:

g++ f1.cpp f2.cpp main.cpp 

dove f1.cpp e f2.cpp sono i file con le funzioni a loro. Per i dettagli su come usare make per fare la build, vedere l'eccellente GNU make documentation.

3

È possibile utilizzare diversi comandi g ++ e quindi collegare, ma il più semplice è utilizzare un Makefile tradizionale o qualche altro sistema di creazione: come Scon (che sono spesso più facili da configurare rispetto ai Makefile).

16

Ora che ho separato le classi nei file .h e .cpp ho bisogno di usare un makefile o posso ancora usare il comando "g ++ main.cpp"?

Compilare più file contemporaneamente è una scelta sbagliata se lo si inserisce nel Makefile.

Normalmente in un Makefile (per GNU/Make) dovrebbe essere sufficiente per scrivere che:

# "all" is name of the default target, running "make" without params would use it 
all: executable1 

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker 
CC=$(CXX) 

# tell which files should be used, .cpp -> .o make would do automatically 
executable1: file1.o file2.o 

questo modo make sarebbe correttamente ricompilazione solo ciò che deve essere ricompilato. Si possono anche aggiungere alcune modifiche per generare le dipendenze del file di intestazione, in modo che make ricostruisca correttamente ciò che è necessario ricostruire a causa delle modifiche apportate al file di intestazione.

2

file .h saranno nulla a che fare con la compilazione ... vi interessa soltanto i file cpp ... quindi digitare g ++ filename1.cpp filename2.cpp main.cpp -o myprogram

significa che si sta compilando ogni cpp file e quindi li hanno collegati insieme in myprgram.

quindi eseguire il programma di ./myprogram

0

Ho usato per usare un Makefile personalizzato che ha compilato tutti i file nella directory corrente, ma ho dovuto copiarlo in ogni directory ne avevo bisogno, ogni volta.

Così ho creato il mio strumento - Universal Compiler che ha reso il processo molto più semplice quando si compilano molti file.

28

Per compilare separatamente, senza il collegamento è necessario aggiungere l'opzione -c:

g++ -c myclass.cpp 
    g++ -c main.cpp 
    g++ myclass.o main.o 
    ./a.out 
+0

Nota se si desidera controllare il nome dell'eseguibile nel passaggio di collegamento, fare semplicemente ciò che si fa normalmente: 'g ++ -o my_executable myclass.o main.o' – neuronet

3

So che questo problema è stato fatto anni fa, ma ancora ha voluto condividere come io di solito compilare più file C++.

  1. Diciamo che avete 5 file cpp, tutto ciò che dovete fare è utilizzare il * invece di digitare ogni file cpp citarne es g ++ -c * cpp -o myprogram.
  2. Questo genererà "myprogram"
  3. eseguire il programma ./myprogram

questo è tutto !!

Il motivo per cui sto usando * è che cosa succederebbe se avessi 30 file cpp li digiti tutti? oppure usa semplicemente il segno * e risparmi tempo :)

p.s Utilizzare questo metodo solo se non ti interessa il makefile.

+0

L'errore di ridefinizione si verifica quando utilizzo questo approccio? C'è un altro modo di fare lo stesso? –

-3

~/In_ProjectDirectory $ g ++ coordin_main.cpp coordin_func.cpp coordin.h

~/In_ProjectDirectory $ ./a.out

... Ha lavorato !!

Utilizzo di Linux Mint con Geany IDE

Quando ho salvato ogni file nella stessa directory, un file non è stato salvato correttamente all'interno della directory; il file coordin.h. Quindi, ricontrollato ed è stato salvato lì come coordin.h, e non erroneamente come -> coordin.h.gch. Le piccole cose. Arg !!

+0

Si ottiene un downvot perché sono stati inclusi file h, che è un errore. – neuronet

Problemi correlati