Używanie G ++ do kompilowania wielu plików .cpp i .h

172

Właśnie odziedziczyłem kod C ++, który został źle napisany z jednym plikiem cpp, który zawierał główną i kilka innych funkcji. Istnieją również .hpliki zawierające klasy i ich definicje funkcji.

Do tej pory program był kompilowany za pomocą polecenia g++ main.cpp. Teraz, gdy rozdzieliłem klasy .hi .cpppliki, czy muszę używać pliku makefile, czy nadal mogę używać g++ main.cpppolecenia?

Meir
źródło

Odpowiedzi:

224

lista wszystkich innych plików cpp po main.cpp.

to znaczy

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

i tak dalej.

Lub możesz skompilować je wszystkie indywidualnie. Następnie łączysz ze sobą wszystkie wynikowe pliki „.o”.

Goz
źródło
152
Możesz nawet to zrobićg++ *.cpp -o output
rubenvb
7
Czy to w ogóle jest zła praktyka? Chciałbym tego użyć w moim pliku makefile.
gabriel_vincent
8
@gabriel_vincent, niekoniecznie jest to zła praktyka, ale oznacza to, że edycja jednego pliku w projekcie składającym się z setek spowoduje, że kompilator przerobi całą pracę dla wszystkich plików. Kompilowanie oddzielnie umożliwia kompilację przyrostową.
Paul Draper,
@gabriel_vincent Na początku nie powinieneś pisać ręcznie plików makefile. Zamiast tego użyj odpowiedniego systemu kompilacji, takiego jak CMake.
Baum mit Augen
3
@BaummitAugen Tak, z wyjątkiem tego, że chcę skompilować ten malutki dwuplikowy program, który napisałem w 14 minut, i naprawdę wolałbym poświęcić 1 minutę na napisanie pliku makefile zamiast godziny na konfigurowanie cmake.
Przemek D
55

Aby skompilować osobno bez linkowania, musisz dodać -copcję:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
FredAKA
źródło
3
Uwaga, jeśli chcesz kontrolować nazwę pliku wykonywalnego w kroku łączenia, po prostu zrób to, co zwykle robisz:g++ -o my_executable myclass.o main.o
eric
22

Po rozdzieleniu klas do plików .h i .cpp, czy muszę używać pliku makefile, czy nadal mogę używać polecenia „g ++ main.cpp”?

Kompilowanie kilku plików na raz to kiepski wybór, jeśli zamierzasz umieścić to w pliku Makefile.

Zwykle w pliku Makefile (dla GNU / Make ) powinno wystarczyć napisanie:

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

W ten sposób makenależałoby poprawnie przekompilować tylko to, co wymaga ponownej kompilacji. Można również dodać kilka poprawek, aby wygenerować zależności pliku nagłówkowego - aby make poprawnie odbudował to, co trzeba odbudować z powodu zmian w pliku nagłówkowym.

Dummy00001
źródło
13

Jeśli chcesz, nadal możesz używać g ++ bezpośrednio:

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

gdzie f1.cpp i f2.cpp to pliki z zawartymi w nich funkcjami. Aby uzyskać szczegółowe informacje o tym, jak używać make do budowania, zobacz doskonałą dokumentację GNU make .


źródło
12

Wiem, że to pytanie zadawano wiele lat temu, ale nadal chciałem się podzielić tym, jak zwykle kompiluję wiele plików c ++.

  1. Powiedzmy, że masz 5 plików cpp, wszystko, co musisz zrobić, to użyć * zamiast wpisywania nazwy każdego pliku cpp np g++ -c *.cpp -o myprogram.
  2. To wygeneruje "myprogram"
  3. uruchom program ./myprogram

to wszystko!!

Powodem, dla którego używam *, jest to, że jeśli masz 30 plików cpp, wpiszesz je wszystkie? lub po prostu użyj znaku * i zaoszczędź czas :)

ps Użyj tej metody tylko wtedy, gdy nie interesuje Cię makefile.

zobair
źródło
1
Kiedy używam tego podejścia, pojawia się błąd redefinicji? Czy jest inny sposób na zrobienie tego samego?
Waseem Ahmad Naeem
11

.h pliki nie będą miały nic wspólnego z kompilacją ... przejmujesz się tylko plikami cpp ... więc wpisz g++ filename1.cpp filename2.cpp main.cpp -o myprogram

oznacza, że ​​kompilujesz każdy plik cpp, a następnie łączysz je razem w plik myprgram.

następnie uruchom program ./myprogram

Mateusz
źródło
7

Jak powiedział rebenvp , użyłem:

g++ *.cpp -o output

A następnie zrób to dla wyjścia:

./output

Ale lepszym rozwiązaniem jest użycie makepliku. Przeczytaj tutaj, aby dowiedzieć się więcej o makeplikach.

Upewnij się również, że dodałeś wymagane .hpliki w .cppplikach.

Pritam Banerjee
źródło
4

Możesz użyć kilku poleceń g ++, a następnie połączyć, ale najłatwiej jest użyć tradycyjnego Makefile lub innego systemu budowania, takiego jak Scons (które są często łatwiejsze do skonfigurowania niż Makefile).

gauteh
źródło
2

Jeśli chcesz używać #include <myheader.hpp>wewnątrz swoich plików cpp, możesz użyć:

g++ *.cpp -I. -o out
Matias Haeussler
źródło
1

Kiedyś używałem niestandardowego pliku Makefile, który kompilował wszystkie pliki w bieżącym katalogu, ale za każdym razem musiałem kopiować go do każdego katalogu, którego potrzebowałem.

Dlatego stworzyłem własne narzędzie - Universal Compiler, które znacznie ułatwiło proces kompilacji wielu plików.

Shubham Chaudhary
źródło
-4

~ / In_ProjectDirectory $ g ++ koordynator_main.cpp koordynator_func.cpp koordynator.h

~ / In_ProjectDirectory $ ./a.out

... Pracowałem !!

Używanie Linux Mint z Geany IDE

Kiedy zapisywałem każdy plik w tym samym katalogu, jeden plik nie został poprawnie zapisany w katalogu; plik koordyn.h. Więc sprawdziłem ponownie i został tam zapisany jako współrzędne.h, a nie niepoprawnie jako -> koordyn.h.gch. Małe rzeczy. Arg !!

Tim Conroy
źródło
3
Otrzymujesz głosy w dół, ponieważ dołączyłeś pliki h, co jest błędem.
eric