Verwenden von G ++ zum Kompilieren mehrerer CPP- und H-Dateien


172

Ich habe gerade einen C ++ - Code geerbt, der schlecht mit einer CPP-Datei geschrieben wurde, die die Haupt- und eine Reihe anderer Funktionen enthielt. Es gibt auch .hDateien, die Klassen und ihre Funktionsdefinitionen enthalten.

Bisher wurde das Programm mit dem Befehl kompiliert g++ main.cpp. Muss ich nach der Trennung der Klassen .hund .cppDateien ein Makefile verwenden oder kann ich den g++ main.cppBefehl trotzdem verwenden ?

Antworten:


224

liste alle anderen cpp-Dateien nach main.cpp auf.

dh

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

und so weiter.

Oder Sie können sie alle einzeln kompilieren. Anschließend verknüpfen Sie alle resultierenden ".o" -Dateien miteinander.


152
Sie können sogar tung++ *.cpp -o output
rubenvb

7
Ist das irgendwie eine schlechte Praxis? Ich möchte dies in meinem Makefile verwenden.
gabriel_vincent

8
@gabriel_vincent, es ist nicht unbedingt eine schlechte Praxis, aber es bedeutet, dass das Bearbeiten einer Datei in einem Projekt von Hunderten den Compiler veranlasst, die gesamte Arbeit für alle Dateien zu wiederholen. Das separate Kompilieren ermöglicht eine inkrementelle Kompilierung.
Paul Draper

@gabriel_vincent Sie sollten Makefiles zunächst nicht von Hand schreiben. Verwenden Sie stattdessen ein geeignetes Build-System wie CMake.
Baum mit Augen

3
@BaummitAugen Ja, außer ich möchte nur dieses winzige 2-Dateien-Programm kompilieren, das ich in 14 Minuten geschrieben habe, und ich würde es wirklich vorziehen, 1 Minute für das Schreiben eines Makefiles zu verwenden, anstatt eine Stunde, um cmake einzurichten.
Przemek D

55

Um separat ohne Verknüpfung zu kompilieren, müssen Sie die folgende -cOption hinzufügen :

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

3
Hinweis: Wenn Sie den Namen der ausführbaren Datei im Verknüpfungsschritt steuern möchten, tun Sie einfach das, was Sie normalerweise tun:g++ -o my_executable myclass.o main.o
Eric

22

Muss ich nach der Trennung der Klassen in .h- und .cpp-Dateien ein Makefile verwenden oder kann ich trotzdem den Befehl "g ++ main.cpp" verwenden?

Das gleichzeitige Kompilieren mehrerer Dateien ist eine schlechte Wahl, wenn Sie diese in das Makefile einfügen möchten.

Normalerweise sollte es in einem Makefile (für GNU / Make ) ausreichen, Folgendes zu schreiben:

# "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

Auf diese Weise makewürde nur das, was neu kompiliert werden muss, ordnungsgemäß neu kompiliert. Man kann auch einige Optimierungen hinzufügen, um die Abhängigkeiten der Header-Dateien zu generieren - so dass make auch das, was aufgrund der Änderungen der Header-Datei neu erstellt werden muss, ordnungsgemäß neu erstellt.


13

Sie können g ++ weiterhin direkt verwenden, wenn Sie möchten:

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

Dabei sind f1.cpp und f2.cpp die Dateien mit den darin enthaltenen Funktionen. Einzelheiten zur Verwendung von make für den Build finden Sie in der hervorragenden Dokumentation zu GNU make .


12

Ich weiß, dass diese Frage vor Jahren gestellt wurde, wollte aber trotzdem mitteilen, wie ich normalerweise mehrere C ++ - Dateien kompiliere.

  1. Angenommen, Sie haben 5 CPP-Dateien. Sie müssen lediglich das * verwenden, anstatt den Namen der einzelnen CPP-Dateien einzugeben g++ -c *.cpp -o myprogram.
  2. Dies wird erzeugen "myprogram"
  3. Führen Sie das Programm aus ./myprogram

das ist alles!!

Der Grund, warum ich * verwende, ist, dass Sie bei 30 cpp-Dateien alle eingeben würden. oder benutze einfach das * Zeichen und spare Zeit :)

ps Verwenden Sie diese Methode nur, wenn Sie sich nicht für Makefile interessieren.


1
Ein Neudefinitionsfehler tritt auf, wenn ich diesen Ansatz verwende? Gibt es eine andere Möglichkeit, dasselbe zu tun?
Waseem Ahmad Naeem

11

.h Dateien haben nichts mit Kompilieren zu tun ... Sie interessieren sich nur für CPP-Dateien ... also geben Sie ein g++ filename1.cpp filename2.cpp main.cpp -o myprogram

bedeutet, dass Sie jede CPP-Datei kompilieren und dann miteinander verknüpfen myprgram.

Führen Sie dann Ihr Programm aus ./myprogram


7

Wie rebenvp sagte, habe ich verwendet:

g++ *.cpp -o output

Und dann machen Sie dies für die Ausgabe:

./output

Eine bessere Lösung ist jedoch die Verwendung von makeDateien. Lesen Sie hier , um mehr über makeDateien zu erfahren .

Stellen Sie außerdem sicher, dass Sie die erforderlichen .hDateien zu den .cppDateien hinzugefügt haben .


4

Sie können mehrere g ++ - Befehle verwenden und dann verknüpfen. Am einfachsten ist es jedoch, ein traditionelles Makefile oder ein anderes Build-System zu verwenden: wie Scons (die häufig einfacher einzurichten sind als Makefiles).


2

Wenn Sie #include <myheader.hpp>in Ihren CPP-Dateien verwenden möchten, können Sie Folgendes verwenden:

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

1

Früher habe ich ein benutzerdefiniertes Makefile verwendet, das alle Dateien im aktuellen Verzeichnis kompiliert hat, aber ich musste es jedes Mal in jedes Verzeichnis kopieren, das ich brauchte.

Also habe ich mein eigenes Tool erstellt - Universal Compiler, das den Prozess beim Kompilieren vieler Dateien erheblich vereinfacht hat.


-4

~ / In_ProjectDirectory $ g ++ Koordinate_main.cpp Koordinate_Func.cpp Koordinate.h

~ / In_ProjectDirectory $ ./a.out

... Hat funktioniert!!

Verwenden von Linux Mint mit Geany IDE

Wenn ich jede Datei in demselben Verzeichnis gespeichert habe, wurde eine Datei nicht korrekt im Verzeichnis gespeichert. die Datei koordin.h. Also erneut überprüft und es wurde dort als Koordinate.h und nicht fälschlicherweise als -> Koordinate.h.gch gespeichert. Das kleine Zeug. Arg !!


3
Sie werden herabgestuft, weil Sie h-Dateien eingefügt haben, was ein Fehler ist.
Eric
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.