Apa perbedaan antara g ++ dan gcc? Yang mana dari mereka harus digunakan untuk pengembangan c ++ umum?
Apa perbedaan antara g ++ dan gcc? Yang mana dari mereka harus digunakan untuk pengembangan c ++ umum?
Jawaban:
gcc
dan 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 -v
opsi (ini akan menampilkan perintah backend toolchain sedang dijalankan).
argv[0]
untuk melihat permohonan mana yang harus digunakan. Ini sangat umum di antara utilitas inti UNIX.
GCC: Koleksi Kompilator GNU
gcc
: Kompilator
g++
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
dan g++
kompilasi *.c\*.cpp
file memiliki beberapa makro tambahan.Macro ekstra saat mengompilasi *.cpp
file:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
dengan melewatkan -lstdc++
parameter.
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. :-)
-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).
Apa perbedaan antara g++
dan gcc
?
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. Seperti gnat
adalah 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 gcc
menyatakan bahwa ...
g++
menerima sebagian besar opsi yang sama dengangcc
dan bahwa standar ...
... penggunaan
gcc
tidak 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 gcc
halaman manual untuk detail lebih lanjut tentang varian opsi antara gcc
dan g++
.
Mana yang harus digunakan untuk pengembangan c ++ umum?
Secara teknis, salah satu gcc
atau 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
, ataumachine-gcc
saat cross-compiling, ataumachine-gcc-version
menjalankan versi GCC tertentu. Saat Anda mengompilasi program C ++, Anda harus memohon GCC sebagaig++
gantinya.
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).
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 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
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
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]
Tapi yang ini masih berfungsi tanpa kesalahan
$ gcc -x c++ -std=c++98 test_cpp.c
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:
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 ++.
Anda bisa membaca lebih lanjut di sini .
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.
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.
g++
juga akan mengartikan .cc
sebagai ekstensi nama file C ++ - only.