Verwenden von G++ zum Kompilieren mehrerer .cpp- und .h-Dateien

Lesezeit: 4 Minuten

Verwenden von G zum Kompilieren mehrerer cpp und h Dateien
Meir

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

Bisher wurde das Programm mit dem Befehl kompiliert g++ main.cpp. Jetzt wo ich die Klassen getrennt habe .h und .cpp Dateien muss ich ein Makefile verwenden oder kann ich das trotzdem verwenden g++ main.cpp Befehl?

  • g++ *.cpp würde ausreichen, um alle cpp-Dateien zu kompilieren, da die Reihenfolge keine Rolle spielt, solange wir noch nicht verlinken.

    – aderchox

    15. März 2021 um 10:49 Uhr

Listen Sie alle anderen cpp-Dateien nach main.cpp auf.

dh

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

und so weiter.

Oder Sie stellen sie alle einzeln zusammen. Anschließend verknüpfen Sie alle resultierenden “.o”-Dateien miteinander.

  • Sie können sogar tun g++ *.cpp -o output

    – rubenvb

    8. Juli 2010 um 10:52 Uhr

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

    – gabriel_vincent

    26. September 2013 um 16:01 Uhr

  • @gabriel_vincent, es ist nicht unbedingt eine schlechte Praxis, aber es bedeutet, dass das Bearbeiten einer Datei in einem Projekt mit Hunderten dazu führt, dass der Compiler die gesamte Arbeit für alle Dateien wiederholt. Das separate Kompilieren ermöglicht eine inkrementelle Kompilierung.

    – Paul Tucher

    17. September 2016 um 21:36 Uhr

  • @gabriel_vincent Sie sollten zunächst keine Makefiles von Hand schreiben. Verwenden Sie stattdessen ein geeignetes Build-System wie CMake.

    – Baum mit Augen

    22. November 2017 um 1:16 Uhr

  • @BaummitAugen Ja, außer dass ich nur dieses winzige 2-Dateien-Programm kompilieren möchte, das ich in 14 Minuten geschrieben habe, und ich würde es wirklich vorziehen, 1 Minute damit zu verbringen, ein Makefile zu schreiben, anstatt eine Stunde mit dem Einrichten von cmake.

    – Przemek D

    27. März 2019 um 7:33 Uhr

1647082812 576 Verwenden von G zum Kompilieren mehrerer cpp und h Dateien
Fred AKA

Um ohne Verknüpfung separat zu kompilieren, müssen Sie hinzufügen -c Möglichkeit:

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

  • Beachten Sie, 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

    – erich

    10. März 2018 um 16:18 Uhr

  • warum nicht einfach verwenden g++ *.cpp ?

    – Ankit Mischra

    24. September 2021 um 16:48 Uhr


1647082812 587 Verwenden von G zum Kompilieren mehrerer cpp und h Dateien
Dummy00001

Jetzt, da ich die Klassen in .h- und .cpp-Dateien getrennt habe, muss ich ein Makefile verwenden oder kann ich immer noch den Befehl “g++ main.cpp” verwenden?

Mehrere Dateien auf einmal zu kompilieren ist eine schlechte Wahl, wenn Sie diese in das Makefile einfügen wollen.

Normalerweise in einem Makefile (z GNU/Make), sollte es genügen zu schreiben:

# "all" is the 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

Dieser Weg make würde nur das neu kompilieren, was neu kompiliert werden muss. Man kann auch einige Optimierungen hinzufügen, um die Header-Datei-Abhängigkeiten zu generieren – so dass make auch ordnungsgemäß neu erstellt, was aufgrund der Header-Datei-Änderungen neu erstellt werden muss.

Verwenden von G zum Kompilieren mehrerer cpp und h Dateien
zobair

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

  1. Nehmen wir an, Sie haben 5 cpp-Dateien, alles, was Sie tun müssen, ist das * zu verwenden, anstatt den Namen jeder cpp-Datei einzugeben g++ -c *.cpp -o myprogram.
  2. Dies wird generiert "myprogram"
  3. führen Sie das Programm aus ./myprogram

das ist alles!!

Der Grund, warum ich * verwende, ist, dass Sie, wenn Sie 30 cpp-Dateien haben, alle eingeben würden? oder benutze einfach das * Zeichen und spare Zeit 🙂

ps Verwenden Sie diese Methode nur, wenn Sie sich nicht um Makefile kümmern.

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

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

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

1647082814 619 Verwenden von G zum Kompilieren mehrerer cpp und h Dateien
Pritam Banerjee

.h Dateien haben nichts mit dem 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 alle cpp-Dateien kompilieren und sie dann miteinander verknüpfen myprgram.

Führen Sie dann Ihr Programm aus ./myprogram

Als rebenvp sagte, ich habe verwendet:

g++ *.cpp -o output

Und dann tun Sie dies für die Ausgabe:

./output

Aber eine bessere Lösung ist zu verwenden make Datei. Lesen Hier um mehr darüber zu erfahren make Dateien.

Stellen Sie außerdem sicher, dass Sie die erforderlichen hinzugefügt haben .h Dateien in der .cpp Dateien.

  • Ich verwende g++-10 und erhalte a fileNotFound Fehler bei der Verwendung dieser Wildcard-Syntax, aber wenn ich die Dateinamen (durch Leerzeichen getrennt) mit demselben Verzeichnispfad einfüge, funktioniert es gut … g++-10 /abs/src/path/*.cpp -o /abs/src/path/binary_file verursacht aber fehler arbeit g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file funktioniert gut…… Was ist das für ein Wahnsinn?

    – ThisGuyCantEven

    22. September 2021 um 17:56 Uhr

993440cookie-checkVerwenden von G++ zum Kompilieren mehrerer .cpp- und .h-Dateien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy