Apa perbedaan antara g ++ dan gcc?

875

Apa perbedaan antara g ++ dan gcc? Yang mana dari mereka harus digunakan untuk pengembangan c ++ umum?

Brian R. Bondy
sumber
g ++ => c ++ compiler gcc => c compiler
Nagappa

Jawaban:

727

gccdan g++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 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).

Kodiologis
sumber
13
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:

  1. gccakan mengkompilasi: *.c\*.cppfile sebagai C dan C ++ masing-masing.
  2. g++akan mengkompilasi: *.c\*.cppfile tetapi semuanya akan diperlakukan sebagai file C ++.
  3. Juga jika Anda gunakan g++untuk menautkan file objek itu secara otomatis link di perpustakaan std C ++ ( gcctidak melakukan ini).
  4. gcc mengkompilasi file C memiliki lebih sedikit makro yang telah ditentukan sebelumnya.
  5. gcckompilasi *.cppdan g++kompilasi *.c\*.cppfile memiliki beberapa makro tambahan.

Macro ekstra saat mengompilasi *.cppfile:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Martin York
sumber
37
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).

Nils Pipenbrinck
sumber
3
+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.

Ini g++ adalah kompiler C ++ untuk Koleksi Kompilator GNU. Seperti gnatadalah kompiler Ada untuk gcc. lihat Menggunakan Koleksi Kompiler GNU (GCC)

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 ++.

The Ubuntu 18.04 halaman manual menambahkan paragraf berikut:

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.

l --marc l
sumber
21

Satu perbedaan penting adalah bahwa jika Anda meneruskan .cfile ke gcc, file itu akan dikompilasi sebagai C.

Perilaku default g ++ adalah memperlakukan .cfile sebagai C ++ (kecuali -x cditentukan).

njsf
sumber
19
(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.

zaphod
sumber
12

Saya menjadi tertarik pada masalah ini dan melakukan beberapa percobaan

  1. Saya menemukan deskripsi itu di sini , tetapi sangat singkat.

  2. 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 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  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

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Tetapi ketika saya mencoba menjalankan alat "koleksi gnu koleksi" dengan cara itu:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Tapi yang ini masih berfungsi tanpa kesalahan

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. Dan ini juga

    $ g++ -std=c++0x test_cpp_11.cpp 

ps Uji file

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Temuan:

  1. 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

  2. gcc berfungsi dengan baik sebagai metatool karena jika Anda memiliki ekstensi yang benar atau mengatur flag -std -x yang benar. Lihat ini

bruziuz
sumber
9

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

Minh-Triet Pham Tran
sumber
0

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 = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

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.

magicmax
sumber
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.

Marcus Thornton
sumber
1
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.
underscore_d