Utilizzo di G ++ per compilare più file .cpp e .h


172

Ho appena ereditato del codice C ++ che è stato scritto male con un file cpp che conteneva le funzioni principali e un sacco di altre. Esistono anche .hfile che contengono classi e le relative definizioni delle funzioni.

Fino ad ora il programma è stato compilato usando il comando g++ main.cpp. Ora che ho separato le classi .he i .cppfile, devo usare un makefile o posso ancora usare il g++ main.cppcomando?

Risposte:


224

elenca tutti gli altri file cpp dopo main.cpp.

vale a dire

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

e così via.

Oppure puoi compilarli tutti singolarmente. Quindi collegare tutti i file ".o" risultanti insieme.


152
Puoi persino fareg++ *.cpp -o output
rubenvb l'

7
È comunque una cattiva pratica? Vorrei usarlo nel mio makefile.
gabriel_vincent,

8
@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 ripeti tutto il lavoro per tutti i file. La compilazione separatamente consente la compilazione incrementale.
Paul Draper,

@gabriel_vincent Non dovresti scrivere a mano i makefile per cominciare. Utilizzare invece un sistema di compilazione adeguato come CMake.
Baum mit Augen

3
@BaummitAugen Sì, tranne che voglio solo compilare questo minuscolo programma in 2 file che ho scritto in 14 minuti, e preferirei davvero passare 1 minuto a scrivere un makefile invece di un'ora per impostare cmake.
Przemek D,

55

Per compilare separatamente senza collegamento è necessario aggiungere -cun'opzione:

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

3
Nota se vuoi controllare il nome dell'eseguibile nella fase di collegamento fai quello che fai di solito:g++ -o my_executable myclass.o main.o
eric

22

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

Compilare più file contemporaneamente è una cattiva scelta se lo inserirai nel Makefile.

Normalmente in un Makefile (per GNU / Make ) dovrebbe essere sufficiente 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

In questo modo makesarebbe correttamente ricompilare solo ciò che deve essere ricompilato. Si possono anche aggiungere alcune modifiche per generare le dipendenze del file di intestazione - in modo che anche ricostruisca correttamente ciò che è necessario ricostruire a causa delle modifiche del file di intestazione.


13

Puoi comunque usare direttamente g ++ se vuoi:

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

dove f1.cpp e f2.cpp sono i file con le funzioni in essi contenute. Per i dettagli su come usare make per realizzare la build, consultare l'eccellente documentazione di GNU make .


12

So che questa domanda è stata posta anni fa, ma volevo ancora condividere come di solito compilo più file c ++.

  1. Supponiamo che tu abbia 5 file cpp, tutto ciò che devi fare è usare * invece di digitare il nome di ciascun file cpp g++ -c *.cpp -o myprogram.
  2. Questo genererà "myprogram"
  3. eseguire il programma ./myprogram

È tutto!!

Il motivo per cui sto usando * è che se avessi 30 file cpp li digiteresti tutti? o usa semplicemente il segno * e risparmia tempo :)

ps Usa questo metodo solo se non ti interessa il makefile.


1
Errore di ridefinizione sorge quando uso questo approccio? C'è un altro modo di fare lo stesso?
Waseem Ahmad Naeem,

11

.h i file non hanno nulla a che fare con la compilazione ... ti preoccupi solo dei file cpp ... quindi digita g++ filename1.cpp filename2.cpp main.cpp -o myprogram

significa che stai compilando ogni file cpp e poi li hai collegati insieme myprgram.

quindi esegui il tuo programma ./myprogram


7

Come diceva rebenvp, ho usato:

g++ *.cpp -o output

E quindi farlo per l'output:

./output

Ma una soluzione migliore è usare il makefile. Leggi qui per saperne di piùmake file.

Assicurati anche di aver aggiunto i .hfile richiesti nei .cppfile.


4

Puoi usare diversi comandi g ++ e poi collegare, ma il più semplice è usare un Makefile tradizionale o qualche altro sistema di compilazione: come Scons (che sono spesso più facili da configurare rispetto ai Makefile).


2

Se si desidera utilizzare #include <myheader.hpp>all'interno dei file cpp è possibile utilizzare:

g++ *.cpp -I. -o out

1

Usavo un Makefile personalizzato che compilava tutti i file nella directory corrente, ma dovevo copiarlo in ogni directory di cui avevo bisogno, ogni volta.

Così ho creato il mio strumento - Universal Compiler che ha reso il processo molto più semplice durante la compilazione di molti file.


-4

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

~ / In_ProjectDirectory $ ./a.out

... Lavorato!!

Uso di Linux Mint con Geany IDE

Quando ho salvato ciascun 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 in modo errato come -> coordin.h.gch. Le piccole cose. Arg !!


3
Stai per essere ridimensionato perché hai incluso h-file, il che è un errore.
eric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.