Menggunakan G ++ untuk mengkompilasi beberapa file .cpp dan .h

172

Saya baru saja mewarisi beberapa kode C ++ yang ditulis dengan buruk dengan satu file cpp yang berisi fungsi utama dan banyak fungsi lainnya. Ada juga .hfile yang berisi kelas dan definisi fungsinya.

Sampai sekarang program ini dikompilasi menggunakan perintah g++ main.cpp. Sekarang saya telah memisahkan kelas .hdan .cppfile apakah saya harus menggunakan makefile atau masih dapatkah saya menggunakan g++ main.cppperintah?

Meir
sumber

Jawaban:

224

daftar semua file cpp lainnya setelah main.cpp.

yaitu

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

dan seterusnya.

Atau Anda dapat mengkompilasi semuanya secara individual. Anda kemudian menautkan semua file ".o" yang dihasilkan secara bersamaan.

Goz
sumber
152
Anda bahkan dapat melakukannyag++ *.cpp -o output
rubenvb
7
Apakah ini praktik yang buruk? Saya ingin menggunakan ini di makefile saya.
gabriel_vincent
8
@ gabriel_vincent, itu belum tentu praktik yang buruk, tetapi itu berarti bahwa mengedit satu file dalam proyek ratusan akan menyebabkan kompiler mengulang semua pekerjaan untuk semua file. Kompilasi secara terpisah memungkinkan untuk kompilasi tambahan.
Paul Draper
@ gabriel_vincent Anda tidak harus menulis makefile secara langsung. Gunakan sistem build yang tepat seperti CMake.
Baum mit Augen
3
@BaummitAugen Ya, kecuali saya hanya ingin mengkompilasi program kecil 2-file yang saya tulis dalam 14 menit, dan saya benar-benar lebih suka menghabiskan 1 menit untuk menulis makefile daripada satu jam menyiapkan cmake.
Przemek D
55

Untuk mengkompilasi secara terpisah tanpa menautkan, Anda perlu menambahkan -copsi:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
Fredaka
sumber
3
Catatan jika Anda ingin mengontrol nama yang dapat dieksekusi pada langkah menautkan lakukan apa yang biasanya Anda lakukan:g++ -o my_executable myclass.o main.o
eric
22

Sekarang saya telah memisahkan kelas menjadi file .h dan .cpp apakah saya perlu menggunakan makefile atau apakah saya masih dapat menggunakan perintah "g ++ main.cpp"?

Mengompilasi beberapa file sekaligus adalah pilihan yang buruk jika Anda ingin memasukkannya ke dalam Makefile.

Biasanya dalam Makefile (untuk GNU / Make ) sudah cukup untuk menulis bahwa:

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

Dengan begitu, makekompilasi ulang yang benar hanya perlu dilakukan kompilasi ulang. Satu juga dapat menambahkan beberapa tweak untuk menghasilkan dependensi file header - sehingga make juga akan membangun kembali dengan benar apa yang perlu dibangun kembali karena perubahan file header.

Dummy00001
sumber
13

Anda masih dapat menggunakan g ++ secara langsung jika Anda ingin:

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

di mana f1.cpp dan f2.cpp adalah file dengan fungsi di dalamnya. Untuk detail tentang bagaimana menggunakan make untuk melakukan build, lihat dokumentasi GNU make yang luar biasa .


sumber
12

Saya tahu pertanyaan ini telah ditanyakan bertahun-tahun yang lalu tetapi masih ingin membagikan bagaimana saya biasanya mengkompilasi beberapa file c ++.

  1. Katakanlah Anda memiliki 5 file cpp, yang harus Anda lakukan adalah menggunakan * alih-alih mengetik setiap nama file cpp misalnya g++ -c *.cpp -o myprogram .
  2. Ini akan menghasilkan "myprogram"
  3. jalankan programnya ./myprogram

itu saja!!

Alasan saya menggunakan * adalah bahwa bagaimana jika Anda memiliki 30 file cpp, apakah Anda akan mengetik semuanya? atau cukup gunakan tanda * dan hemat waktu :)

ps Gunakan metode ini hanya jika Anda tidak peduli dengan makefile.

zobair
sumber
1
Kesalahan redefinisi muncul ketika saya menggunakan pendekatan ini? Apakah ada cara lain untuk melakukan hal yang sama?
Waseem Ahmad Naeem
11

.h file tidak akan ada hubungannya dengan kompilasi ... Anda hanya peduli dengan file cpp ... jadi ketikkan g++ filename1.cpp filename2.cpp main.cpp -o myprogram

berarti Anda mengkompilasi setiap file cpp dan kemudian menautkannya menjadi satu myprgram .

kemudian jalankan program Anda ./myprogram

Matius
sumber
7

Seperti yang dikatakan rebenvp , saya menggunakan:

g++ *.cpp -o output

Dan kemudian lakukan ini untuk output:

./output

Tetapi solusi yang lebih baik adalah menggunakan makefile. Baca di sini untuk tahu lebih banyak tentangmake file.

Pastikan juga bahwa Anda telah menambahkan .hfile yang diperlukan di.cpp file.

Pritam Banerjee
sumber
4

Anda dapat menggunakan beberapa perintah g ++ lalu menautkan, tetapi yang termudah adalah menggunakan Makefile tradisional atau sistem build lain: seperti Scons (yang seringkali lebih mudah diatur daripada Makefiles).

gauteh
sumber
2

Jika Anda ingin menggunakan #include <myheader.hpp>di dalam file cpp Anda, Anda dapat menggunakan:

g++ *.cpp -I. -o out
Matias Haeussler
sumber
1

Saya dulu menggunakan Makefile khusus yang mengkompilasi semua file di direktori saat ini, tetapi saya harus menyalinnya di setiap direktori yang saya butuhkan, setiap kali.

Jadi saya membuat alat saya sendiri - Universal Compiler yang membuat proses lebih mudah ketika mengkompilasi banyak file.

Shubham Chaudhary
sumber
-4

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

~ / In_ProjectDirectory $ ./a.out

... Bekerja!!

Menggunakan Linux Mint dengan Geany IDE

Ketika saya menyimpan setiap file ke direktori yang sama, satu file tidak disimpan dengan benar dalam direktori; file coordin.h. Jadi, periksa kembali dan disimpan di sana sebagai coordin.h, dan tidak salah sebagai -> coordin.h.gch. Hal-hal kecil. Arg !!

Tim Conroy
sumber
3
Anda mendapatkan unduhan karena Anda telah memasukkan file-h, yang merupakan kesalahan.
eric