gccdan g++merupakan kompiler-driver dari GNU Compiler Collection (yang dulunya hanya GNU C Compiler ).
Meskipun mereka secara otomatis menentukan backend ( cc1cc1plus...) yang akan dipanggil tergantung pada tipe file, kecuali diganti -x language, mereka memiliki beberapa perbedaan.
Perbedaan yang mungkin paling penting dalam standarnya adalah perpustakaan mana yang mereka tautkan secara otomatis.
Menurut opsi tautan dokumentasi online GCC dan cara g ++ dipanggil , g++sama dengan gcc -xc++ -lstdc++ -shared-libgcc(yang pertama adalah opsi kompilator, kedua yang kedua adalah opsi tautan). Ini dapat diperiksa dengan menjalankan keduanya dengan -vopsi (ini akan menampilkan perintah backend toolchain sedang dijalankan).
Dari jawaban ini, saya menyimpulkan bahwa perintah g ++ secara efektif hanya gcc dengan banyak flag .. Lalu mengapa, ada dua binari yang berbeda (dengan ukuran yang kira-kira sama) untuk gcc dan g ++ di linux? Bukankah seharusnya kita hanya memiliki satu biner dan satu symlink (atau sesuatu di sepanjang garis itu)?
UchihaItachi
9
@Uchihaltachi file-file ini adalah tautan keras dan ketika mereka boot mereka memeriksa argv[0]untuk melihat permohonan mana yang harus digunakan. Ini sangat umum di antara utilitas inti UNIX.
Nikmati
438
GCC: Koleksi Kompilator GNU
Perujuk ke semua bahasa berbeda yang didukung oleh kompiler GNU.
gcc: Kompilator g++GNU C: Kompilator GNU C ++
Perbedaan utama:
gccakan mengkompilasi: *.c\*.cppfile sebagai C dan C ++ masing-masing.
g++akan mengkompilasi: *.c\*.cppfile tetapi semuanya akan diperlakukan sebagai file C ++.
Juga jika Anda gunakan g++untuk menautkan file objek itu secara otomatis link di perpustakaan std C ++ ( gcctidak melakukan ini).
gcc mengkompilasi file C memiliki lebih sedikit makro yang telah ditentukan sebelumnya.
gcckompilasi *.cppdan g++kompilasi *.c\*.cppfile memiliki beberapa makro tambahan.
Anda dapat menghubungkan std C ++ library di gccdengan melewatkan -lstdc++parameter.
Denilson Sá Maia
16
Ada lebih banyak perbedaan antara 'gcc' dan 'g ++' dari hanya perpustakaan standar, jadi gcc -lstdc++masih tidak akan membuat Anda memiliki perilaku yang sama g++. Kami menempatkan semua perilaku khusus bahasa itu ke dalam pengemudinya sendiri karena suatu alasan, untuk itulah ia ada. :-)
Ti Strga
8
Komentar saya tidak hanya berbicara tentang menautkan ... itulah intinya. Bahkan hanya membatasi diskusi untuk menautkan (yang jawaban Anda tidak), pengguna masih tidak akan dapat menggunakan seluruh pustaka standar C ++ dengan hanya menentukan -lstdc++, karena akan ada dependensi yang hilang pada matematika, RTTI, dan informasi pengecualian. Apakah tautan test case yang diberikan atau gagal akan tergantung pada sistem operasi dan fitur C ++ mana yang digunakan oleh test case, yang sekali lagi adalah mengapa semua pengetahuan itu dimasukkan ke dalam driver g ++ daripada diserahkan kepada pengguna untuk mencari tahu .
Ti Strga
10
Percayalah, kami sering berdiskusi, biasanya ketika pengguna Linux mencoba untuk memindahkan Makefile yang tidak lengkap ke platform lain. :-) Tahap tautan g ++ melakukan lebih banyak daripada gcc -lstdc++di OS lain, terutama ketika targetnya adalah platform tertanam. Untungnya, itu sebabnya kami mengirim g ++ di tempat pertama.
Ti Strga
10
String spec dibuat khusus untuk compiler, yang pada gilirannya spesifik untuk sistem operasi dan target. Jadi jika Anda menjalankan -dumpspec(misalnya) kompiler silang yang menargetkan sistem tertanam, Anda akan melihat perbedaannya. Ada lebih dari sekadar perbedaan tautan ... yang lagi-lagi adalah jawaban Anda (makro preprocessor, sertakan jalur, beberapa pustaka runtime). Kami sepertinya saling berbicara satu sama lain, tetapi sebagai mantan pengelola GCC, saya yakinkan Anda bahwa saya mengenal apa itu frontend dan tidak.
Ti Strga
82
Untuk c ++ Anda harus menggunakan g ++.
Ini adalah kompiler yang sama (misalnya koleksi kompiler GNU). GCC atau G ++ cukup pilih front-end yang berbeda dengan opsi default yang berbeda.
Singkatnya: jika Anda menggunakan g ++ frontend akan memberi tahu linker bahwa Anda mungkin ingin menautkan dengan pustaka standar C ++. Frontend gcc tidak akan melakukan itu (juga bisa terhubung dengan mereka jika Anda melewati opsi baris perintah yang tepat).
+1 Juga halaman manual gcc GNU / Linux saya mengatakan, "Ketika Anda mengkompilasi program C ++, Anda harus memanggil GCC sebagai g ++."
Tampilan elips
35
Apa perbedaan antara g++dan gcc?
gcctelah berkembang dari satu bahasa "GNU C Compiler" menjadi multi-bahasa "GNU Compiler Collection". Istilah "GNU C Compiler" kadang-kadang masih digunakan dalam konteks pemrograman C.
Sebagai contoh, perintah Ubuntu 16.04 dan 18.04 man g++mengembalikan GCC(1)halaman buku panduan.
Ubuntu 16.04 dan 18.04 man gccmenyatakan bahwa ...
g++ menerima sebagian besar opsi yang sama dengan gcc
dan bahwa standar ...
... penggunaan gcctidak menambah pustaka C ++. g++adalah program yang memanggil GCC dan secara otomatis menentukan tautan ke pustaka C ++. Ini memperlakukan file .c, .h dan .i sebagai file sumber C ++ alih-alih file sumber C kecuali -x digunakan. Program ini juga berguna ketika mengkompilasi file header C dengan ekstensi .h untuk digunakan dalam kompilasi C ++.
Cari gcchalaman manual untuk detail lebih lanjut tentang varian opsi antara gccdan g++.
Mana yang harus digunakan untuk pengembangan c ++ umum?
Secara teknis, salah satu gccatau g++dapat digunakan untuk pengembangan C ++ umum dengan pengaturan opsi yang berlaku. Namun, g++perilaku default secara alami selaras dengan pengembangan C ++.
Cara yang biasa untuk menjalankan GCC adalah dengan menjalankan executable yang dipanggil gcc, atau machine-gccsaat cross-compiling, atau machine-gcc-versionmenjalankan versi GCC tertentu. Saat Anda mengompilasi program C ++, Anda harus memohon GCC sebagai g++gantinya.
(Terlambat, tetapi untuk anak cucu,) Seperti yang ditunjukkan oleh jawaban lain, ini sama sekali bukan "satu-satunya perbedaan penting", kecuali jika pembaca memiliki definisi kemiringan yang miring.
underscore_d
16
Meskipun perintah gcc dan g ++ melakukan hal yang sangat mirip, g ++ dirancang untuk menjadi perintah yang Anda panggil untuk mengkompilasi program C ++; itu dimaksudkan untuk secara otomatis melakukan hal yang benar.
Di belakang layar, mereka benar-benar program yang sama. Seperti yang saya mengerti, keduanya memutuskan apakah akan mengkompilasi program sebagai C atau sebagai C ++ berdasarkan ekstensi nama file. Keduanya mampu terhubung dengan pustaka standar C ++, tetapi hanya g ++ yang melakukan ini secara default. Jadi, jika Anda memiliki program yang ditulis dalam C ++ yang tidak perlu terhubung dengan pustaka standar, gcc akan melakukan hal yang benar; tapi kemudian, begitu juga g ++. Jadi sebenarnya tidak ada alasan untuk tidak menggunakan g ++ untuk pengembangan C ++ secara umum.
Saya menjadi tertarik pada masalah ini dan melakukan beberapa percobaan
Saya menemukan deskripsi itu di sini , tetapi sangat singkat.
Kemudian saya mencoba bereksperimen dengan gcc.exe dan g ++ .exe di mesin windows saya:
$ g++--version | head -n1
g++.exe (gcc-4.6.3 release with patches [build 20121012by perlmingw.sf.net])4.6.3
$ gcc --version | head -n1
gcc.exe (gcc-4.6.3 release with patches [build 20121012by perlmingw.sf.net])4.6.3
Saya mencoba untuk mengkompilasi file uji sederhana c89, c99, dan c ++ 1998 dan ini bekerja dengan baik untuk saya dengan ekstensi yang benar sesuai dengan bahasa
Jika melihat pohon proses maka tampaknya gcc, dan g ++ adalah backend ke alat lain, yang di lingkungan saya adalah: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc berfungsi dengan baik sebagai metatool karena jika Anda memiliki ekstensi yang benar atau mengatur flag -std -x yang benar. Lihat ini
"GCC" adalah istilah singkatan umum untuk Koleksi Kompiler GNU. Ini adalah nama yang paling umum untuk kompiler, dan nama yang digunakan ketika penekanannya adalah pada kompilasi program C (sebagai singkatan yang sebelumnya adalah singkatan dari "GNU C Compiler").
Ketika merujuk pada kompilasi C ++, biasanya memanggil kompiler “G ++”. Karena hanya ada satu kompiler, itu juga akurat untuk menyebutnya "GCC" tidak peduli apa bahasa konteksnya; Namun, istilah "G ++" lebih berguna ketika penekanannya adalah pada kompilasi program C ++.
Saya sedang menguji gcc dan g ++ di sistem linux. Dengan menggunakan MAKEFILE, saya dapat mendefinisikan kompiler yang digunakan oleh "GNU make". Saya menguji dengan fitur penempatan "memori dinamis" yang disebut "C plus plus" oleh:
int main(){int* myptr =newint;* myptr =1;
printf("myptr[0] is %i\n",*myptr);return0;}
Hanya g ++ yang berhasil dikompilasi di komputer saya sementara gcc akan melaporkan kesalahan
undefined reference to `operator new(unsigned long)'
Jadi kesimpulan saya sendiri adalah gcc tidak sepenuhnya mendukung "C plus plus". Tampaknya memilih g ++ untuk file sumber C ++ adalah opsi yang lebih baik.
Anda harus melakukan dua pekerjaan: 1. pilih bahasa 2. pilih beberapa perpustakaan suhch sebagai libstdc ++
PersianGulf
-1
gcc dan g ++ keduanya adalah kompiler GNU. Keduanya mengkompilasi c dan c ++. Perbedaannya adalah untuk file * .c gcc memperlakukannya sebagai program ac, dan g ++ melihatnya sebagai program ac ++. * .cpp file dianggap sebagai program c ++. c ++ adalah super set c dan sintaksisnya lebih ketat, jadi berhati-hatilah dengan suffix.
C ++ adalah bahasa yang berbeda, bukan superset C yang ketat, jadi kompilasi dengan bahasa target yang salah mungkin menghasilkan hasil yang tidak terduga. Perhatikan juga bahwa g++juga akan mengartikan .ccsebagai ekstensi nama file C ++ - only.
Jawaban:
gcc
dang++
merupakan kompiler-driver dari GNU Compiler Collection (yang dulunya hanya GNU C Compiler ).Meskipun mereka secara otomatis menentukan backend (
cc1
cc1plus
...) yang akan dipanggil tergantung pada tipe file, kecuali diganti-x language
, mereka memiliki beberapa perbedaan.Perbedaan yang mungkin paling penting dalam standarnya adalah perpustakaan mana yang mereka tautkan secara otomatis.
Menurut opsi tautan dokumentasi online GCC dan cara g ++ dipanggil ,
g++
sama dengangcc -xc++ -lstdc++ -shared-libgcc
(yang pertama adalah opsi kompilator, kedua yang kedua adalah opsi tautan). Ini dapat diperiksa dengan menjalankan keduanya dengan-v
opsi (ini akan menampilkan perintah backend toolchain sedang dijalankan).sumber
argv[0]
untuk melihat permohonan mana yang harus digunakan. Ini sangat umum di antara utilitas inti UNIX.GCC: Koleksi Kompilator GNU
gcc
: Kompilatorg++
GNU C: Kompilator GNU C ++Perbedaan utama:
gcc
akan mengkompilasi:*.c\*.cpp
file sebagai C dan C ++ masing-masing.g++
akan mengkompilasi:*.c\*.cpp
file tetapi semuanya akan diperlakukan sebagai file C ++.g++
untuk menautkan file objek itu secara otomatis link di perpustakaan std C ++ (gcc
tidak melakukan ini).gcc
mengkompilasi file C memiliki lebih sedikit makro yang telah ditentukan sebelumnya.gcc
kompilasi*.cpp
dang++
kompilasi*.c\*.cpp
file memiliki beberapa makro tambahan.Macro ekstra saat mengompilasi
*.cpp
file:sumber
gcc
dengan melewatkan-lstdc++
parameter.gcc -lstdc++
masih tidak akan membuat Anda memiliki perilaku yang samag++
. Kami menempatkan semua perilaku khusus bahasa itu ke dalam pengemudinya sendiri karena suatu alasan, untuk itulah ia ada. :-)-lstdc++
, karena akan ada dependensi yang hilang pada matematika, RTTI, dan informasi pengecualian. Apakah tautan test case yang diberikan atau gagal akan tergantung pada sistem operasi dan fitur C ++ mana yang digunakan oleh test case, yang sekali lagi adalah mengapa semua pengetahuan itu dimasukkan ke dalam driver g ++ daripada diserahkan kepada pengguna untuk mencari tahu .gcc -lstdc++
di OS lain, terutama ketika targetnya adalah platform tertanam. Untungnya, itu sebabnya kami mengirim g ++ di tempat pertama.-dumpspec
(misalnya) kompiler silang yang menargetkan sistem tertanam, Anda akan melihat perbedaannya. Ada lebih dari sekadar perbedaan tautan ... yang lagi-lagi adalah jawaban Anda (makro preprocessor, sertakan jalur, beberapa pustaka runtime). Kami sepertinya saling berbicara satu sama lain, tetapi sebagai mantan pengelola GCC, saya yakinkan Anda bahwa saya mengenal apa itu frontend dan tidak.Untuk c ++ Anda harus menggunakan g ++.
Ini adalah kompiler yang sama (misalnya koleksi kompiler GNU). GCC atau G ++ cukup pilih front-end yang berbeda dengan opsi default yang berbeda.
Singkatnya: jika Anda menggunakan g ++ frontend akan memberi tahu linker bahwa Anda mungkin ingin menautkan dengan pustaka standar C ++. Frontend gcc tidak akan melakukan itu (juga bisa terhubung dengan mereka jika Anda melewati opsi baris perintah yang tepat).
sumber
Apa perbedaan antara
g++
dangcc
?gcc
telah berkembang dari satu bahasa "GNU C Compiler" menjadi multi-bahasa "GNU Compiler Collection". Istilah "GNU C Compiler" kadang-kadang masih digunakan dalam konteks pemrograman C.Ini
g++
adalah kompiler C ++ untuk Koleksi Kompilator GNU. Sepertignat
adalah kompiler Ada untukgcc
. lihat Menggunakan Koleksi Kompiler GNU (GCC)Sebagai contoh, perintah Ubuntu 16.04 dan 18.04
man g++
mengembalikanGCC(1)
halaman buku panduan.Ubuntu 16.04 dan 18.04
man gcc
menyatakan bahwa ...dan bahwa standar ...
Cari
gcc
halaman manual untuk detail lebih lanjut tentang varian opsi antaragcc
dang++
.Mana yang harus digunakan untuk pengembangan c ++ umum?
Secara teknis, salah satu
gcc
ataug++
dapat digunakan untuk pengembangan C ++ umum dengan pengaturan opsi yang berlaku. Namun,g++
perilaku default secara alami selaras dengan pengembangan C ++.The Ubuntu 18.04 halaman manual menambahkan paragraf berikut:
sumber
Satu perbedaan penting adalah bahwa jika Anda meneruskan
.c
file ke gcc, file itu akan dikompilasi sebagai C.Perilaku default g ++ adalah memperlakukan
.c
file sebagai C ++ (kecuali-x c
ditentukan).sumber
Meskipun perintah gcc dan g ++ melakukan hal yang sangat mirip, g ++ dirancang untuk menjadi perintah yang Anda panggil untuk mengkompilasi program C ++; itu dimaksudkan untuk secara otomatis melakukan hal yang benar.
Di belakang layar, mereka benar-benar program yang sama. Seperti yang saya mengerti, keduanya memutuskan apakah akan mengkompilasi program sebagai C atau sebagai C ++ berdasarkan ekstensi nama file. Keduanya mampu terhubung dengan pustaka standar C ++, tetapi hanya g ++ yang melakukan ini secara default. Jadi, jika Anda memiliki program yang ditulis dalam C ++ yang tidak perlu terhubung dengan pustaka standar, gcc akan melakukan hal yang benar; tapi kemudian, begitu juga g ++. Jadi sebenarnya tidak ada alasan untuk tidak menggunakan g ++ untuk pengembangan C ++ secara umum.
sumber
Saya menjadi tertarik pada masalah ini dan melakukan beberapa percobaan
Saya menemukan deskripsi itu di sini , tetapi sangat singkat.
Kemudian saya mencoba bereksperimen dengan gcc.exe dan g ++ .exe di mesin windows saya:
Saya mencoba untuk mengkompilasi file uji sederhana c89, c99, dan c ++ 1998 dan ini bekerja dengan baik untuk saya dengan ekstensi yang benar sesuai dengan bahasa
Tetapi ketika saya mencoba menjalankan alat "koleksi gnu koleksi" dengan cara itu:
Tapi yang ini masih berfungsi tanpa kesalahan
Dan ini juga
ps Uji file
Temuan:
Jika melihat pohon proses maka tampaknya gcc, dan g ++ adalah backend ke alat lain, yang di lingkungan saya adalah: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc berfungsi dengan baik sebagai metatool karena jika Anda memiliki ekstensi yang benar atau mengatur flag -std -x yang benar. Lihat ini
sumber
"GCC" adalah istilah singkatan umum untuk Koleksi Kompiler GNU. Ini adalah nama yang paling umum untuk kompiler, dan nama yang digunakan ketika penekanannya adalah pada kompilasi program C (sebagai singkatan yang sebelumnya adalah singkatan dari "GNU C Compiler").
Ketika merujuk pada kompilasi C ++, biasanya memanggil kompiler “G ++”. Karena hanya ada satu kompiler, itu juga akurat untuk menyebutnya "GCC" tidak peduli apa bahasa konteksnya; Namun, istilah "G ++" lebih berguna ketika penekanannya adalah pada kompilasi program C ++.
Anda bisa membaca lebih lanjut di sini .
sumber
Saya sedang menguji gcc dan g ++ di sistem linux. Dengan menggunakan MAKEFILE, saya dapat mendefinisikan kompiler yang digunakan oleh "GNU make". Saya menguji dengan fitur penempatan "memori dinamis" yang disebut "C plus plus" oleh:
Hanya g ++ yang berhasil dikompilasi di komputer saya sementara gcc akan melaporkan kesalahan
Jadi kesimpulan saya sendiri adalah gcc tidak sepenuhnya mendukung "C plus plus". Tampaknya memilih g ++ untuk file sumber C ++ adalah opsi yang lebih baik.
sumber
gcc dan g ++ keduanya adalah kompiler GNU. Keduanya mengkompilasi c dan c ++. Perbedaannya adalah untuk file * .c gcc memperlakukannya sebagai program ac, dan g ++ melihatnya sebagai program ac ++. * .cpp file dianggap sebagai program c ++. c ++ adalah super set c dan sintaksisnya lebih ketat, jadi berhati-hatilah dengan suffix.
sumber
g++
juga akan mengartikan.cc
sebagai ekstensi nama file C ++ - only.