G ++ ve gcc arasındaki fark nedir?


875

G ++ ve gcc arasındaki fark nedir? Bunlardan hangisi genel c ++ gelişimi için kullanılmalıdır?


g ++ => c ++ derleyici gcc => c derleyici
Nagappa

Yanıtlar:


727

gccve bir zamanlar sadece GNU C Derleyicisi olan g++GNU Derleyici Koleksiyonunun derleyici sürücüleri .

cc1 cc1plusDosya türüne bağlı olarak hangi arka uçların ( ...) çağrılacağını otomatik olarak belirleseler de -x language, geçersiz kılınmadığı sürece bazı farklılıkları vardır.

Varsayılanlarındaki en önemli fark, hangi kitaplıklara otomatik olarak bağlandıklarıdır.

GCC online dokümantasyon göre bağlantı seçenekleri ve nasıl g ++ is çağrılan , g++eşdeğerdir gcc -xc++ -lstdc++ -shared-libgcc(1 bir derleyici seçeneği, 2 iki bağlayıcı seçenekleridir olduğunu). Bu, her iki -vseçenekle de çalıştırılabilir (çalıştırılan arka uç araç zinciri komutlarını görüntüler).


13
Bu cevaptan, etkili bir şekilde g ++ komutunun sadece bir sürü bayrakla gcc olduğu sonucuna varıyorum. Neden o zaman, linux'da gcc ve g ++ için iki farklı ikili (yaklaşık aynı boyutta) var? Sadece bir ikili ve bir sembolik (ya da bu satırlar boyunca bir şey) olmamalı mı?
UchihaItachi

9
@Uchihaltachi bu dosyalar sabit bağlantılar ve önyükleme yapıldığında argv[0]hangi çağrının kullanılması gerektiğini kontrol ederler. Bu temel UNIX yardımcı programları arasında oldukça yaygındır.
Relish

438

GCC: GNU Derleyici Koleksiyonu

  • GNU derleyicisi tarafından desteklenen tüm farklı dillere yönlendirir.

gcc: GNU C Derleyici
g++: GNU C ++ Derleyici

Temel farklar:

  1. gccderler: *.c\*.cppdosyaları sırasıyla C ve C ++.
  2. g++: *.c\*.cppdosyaları derleyecek, ancak hepsi C ++ dosyaları olarak değerlendirilecektir.
  3. Ayrıca g++nesne dosyalarını bağlamak için kullanırsanız , std C ++ kitaplıklarına otomatik olarak bağlanır ( gccbunu yapmaz).
  4. gcc C dosyalarını derlemek daha az önceden tanımlanmış makroya sahiptir.
  5. gccdosyaları derlemek *.cppve g++derlemek *.c\*.cppbirkaç ekstra makroya sahiptir.

*.cppDosyaları derlerken fazladan Makrolar :

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

37
Std C ++ kütüphanesini parametre gccileterek bağlayabilirsiniz -lstdc++.
Denilson Sá Maia

16
'Gcc' ve 'g ++' arasında yalnızca standart kitaplıklardan daha fazla fark vardır, bu yüzden gcc -lstdc++yine de aynı davranışı elde edemezsiniz g++. Dile özgü tüm davranışları bir nedenden dolayı kendi sürücüsüne koyduk, bunun için var. :-)
Ti Strga

8
Benim yorumum sadece bağlantıdan bahsetmiyor ... konu bu. Sadece tartışmayı bağlantıya kısıtlamakla bile (ki cevabınız değildi), kullanıcı hala C ++ standart kütüphanesinin tamamını sadece belirterek kullanamaz -lstdc++, çünkü matematik, RTTI ve istisna bilgilerine bağımlılıklar olmayacaktır. Belirli bir test senaryosu bağlantılarının veya başarısızlıklarının işletim sistemine ve test senaryosu tarafından hangi C ++ özelliklerinin kullanıldığına bağlı olacağı, bu bilginin tümünün kullanıcı tarafından çözülmek yerine g ++ sürücüsüne yerleştirilmesinin nedeni budur. .
Ti Strga

10
Güven bana, genellikle bir Linux kullanıcısı eksik Makefile'sini başka bir platforma taşımaya çalıştığında bu tartışmayı çok fazla yapıyoruz. :-) g ++ bağlantı aşaması gcc -lstdc++, özellikle hedef gömülü bir platform olduğunda, diğer işletim sistemlerinden çok daha fazlasını yapar. Neyse ki, ilk etapta bir g ++ gönderiyoruz.
Ti Strga

10
Spesifikasyon dizeleri, derleyiciye özgü olacak şekilde yapılandırılmıştır, bu da işletim sistemine ve hedefe özgüdür. Dolayısıyla -dumpspec, gömülü bir sistemi hedefleyen bir çapraz derleyici üzerinde çalışırsanız (örneğin), farkları göreceksiniz. Sadece linker farklılıklarından daha fazlası var ... ki yine cevabınız buydu (önişlemci makroları, yolları dahil et, çoklu çalışma zamanı kütüphaneleri). Birbirimizi geçiyor gibi görünüyoruz, ancak eski bir GCC bakıcısı olarak, ön uçların ne olduğunu ve olmadığına aşina olduğumu garanti ederim.
Ti Strga

82

C ++ için g ++ kullanmalısınız.

Aynı derleyici (örneğin GNU derleyici koleksiyonu). GCC veya G ++, farklı varsayılan seçeneklerle farklı bir kullanıcı arabirimi seçer.

Özetle: g ++ kullanırsanız, ön uç bağlayıcıya C ++ standart kitaplıklarıyla bağlantı kurmak isteyebileceğinizi söyler. Gcc ön ucu bunu yapmaz (ayrıca doğru komut satırı seçeneklerini geçerseniz onlarla bağlantı kurabilir).


3
+1 Ayrıca GNU / Linux gcc kılavuzumda "C ++ programlarını derlediğinizde GCC'yi g ++ olarak çağırmalısınız" diyor.
Eliptik görünüm

35

Arasındaki fark nedir g++ve gcc?

gcctek bir dilde "GNU C Derleyici" den çok dilli bir "GNU Derleyici Koleksiyonu" olarak gelişmiştir. "GNU C Derleyici" terimi hala bazen C programlama bağlamında kullanılmaktadır.

g++ Olan GNU derleyicisi için C ++ derleyicisi. Gibi gnatiçin Ada derleyici olduğunu gcc. bkz. GNU Derleyici Koleksiyonunu (GCC) Kullanma

Örneğin, Ubuntu 16.04 ve 18.04 man g++komutu GCC(1)manuel sayfayı döndürür .

Ubuntu 16.04 ve 18.04 man gcc, ...

g++ çoğunlukla aynı seçenekleri kabul eder gcc

ve varsayılan ...

... kullanımı gccC ++ kitaplığını eklemez. g++GCC'yi çağıran ve C ++ kitaplığına otomatik olarak bağlanmayı belirten bir programdır. -X kullanılmadıkça .c, .h ve .i dosyalarını C kaynak dosyaları yerine C ++ kaynak dosyaları olarak ele alır. Bu program, C ++ derlemelerinde kullanılmak üzere .h uzantılı bir C başlık dosyasını önceden derlerken de yararlıdır.

Ve gccarasındaki seçenek farkları hakkında daha fazla bilgi için kılavuz sayfalarında arama yapın . gccg++

Hangisi genel c ++ gelişimi için kullanılmalıdır?

Teknik olarak, uygulanabilir seçenek ayarlarıyla genel C ++ geliştirme için kullanılabilir gccveya g++kullanılabilir. Ancak, g++varsayılan davranış doğal olarak bir C ++ geliştirmeyle hizalanır.

Ubuntu 18.04 adam sayfası aşağıdaki paragraf eklenmiştir:

GCC'yi çalıştırmanın genel yolu, çağrılan yürütülebilir dosyayı gccveya machine-gccçapraz derleme yaparken veya machine-gcc-versionGCC'nin belirli bir sürümünü çalıştırmaktır. C ++ programlarını derlerken GCC'yi bunun g++yerine çağırmalısınız .


21

Önemli bir fark, bir .cdosyayı gcc'ye iletirseniz C olarak derlenmesidir.

G ++ 'nın varsayılan davranışı, .cdosyalara C ++ (aksi -x cbelirtilmedikçe) olarak davranmaktır .


19
(Geç, ama gelecek nesiller için) Diğer cevapların da işaret ettiği gibi, okuyucunun kayda değer bir not tanımı olmadığı sürece, bu hiçbir şekilde "tek dikkate değer fark" değildir.
underscore_d

16

Gcc ve g ++ komutları çok benzer şeyler yapsa da, g ++ bir C ++ programını derlemek için çağırdığınız komut olarak tasarlanmıştır; otomatik olarak doğru olanı yapmak için tasarlanmıştır.

Perde arkasında, gerçekten aynı program. Anladığım kadarıyla, her ikisi de bir programı dosya adı uzantısına göre C veya C ++ olarak derlemeye karar verir. Her ikisi de C ++ standart kitaplığına bağlanabilir, ancak varsayılan olarak bunu yalnızca g ++ yapar. C ++ 'da yazılmış ve standart kütüphaneye bağlanması gerekmeyen bir programınız varsa, gcc doğru olanı yapacaktır; ama sonra, g ++ olur. Bu nedenle, genel C ++ geliştirme için g ++ kullanmamanın hiçbir nedeni yoktur.


12

Konuya ilgi duymaya başladım ve bazı deneyler yaptım

  1. Bu açıklamayı burada buldum , ama çok kısa.

  2. Sonra Windows makinemde gcc.exe ve g ++. Exe ile denemeye çalıştım:

    $ 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. C89, c99 ve c ++ 1998 basit test dosyalarını derlemeye çalıştım ve dil için doğru uzantılarla eşleşen benim için iyi çalışıyor

    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. Ama "gnu derleyici toplama" aracını bu şekilde çalıştırmaya çalıştığımda:

    $ 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. Ama bu hala hatasız çalışıyor

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. Ve bu da

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

ps Test dosyaları

$ 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;
}

Bulgular:

  1. İşlem ağacına bakarsanız, o zaman gcc ve g ++ 'ın ortamımda olan diğer araçlara arka ucu olduğu görülmektedir: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. gcc, doğru uzantıya sahipseniz veya doğru -std -x bayraklarını ayarladıysanız meta araç olarak iyi çalışır. Bkz bu


9

“GCC”, GNU Derleyici Koleksiyonu için ortak bir kısayol terimidir. Bu hem derleyici için en genel addır, hem de vurgu C programlarını derlerken kullanıldığında kullanılan addır (daha önce "GNU C Derleyici" olarak kullanılan kısaltma).

C ++ derlemesine başvururken derleyiciyi “G ++” olarak adlandırmak olağandır. Sadece bir derleyici olduğu için, dil bağlamı ne olursa olsun buna “GCC” demek doğrudur; ancak, “G ++” terimi C ++ programlarının derlenmesine vurgu yapıldığında daha kullanışlıdır.

Burada daha fazlasını okuyabilirsiniz .


0

Linux sisteminde gcc ve g ++ test ediyordum. MAKEFILE kullanarak, "GNU markası" tarafından kullanılan bilgisayarları tanımlayabilirim. Ben "C artı artı" sözde "dinamik bellek" bulma özelliği ile test:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Gcc hata bildirirken yalnızca g ++ bilgisayarımda başarıyla derleyebilir

undefined reference to `operator new(unsigned long)'

Yani benim kendi sonucum gcc "C artı artı" tamamen desteklemiyor olduğunu. C ++ kaynak dosyaları için g ++ seçmenin daha iyi bir seçenek olduğu görülmektedir.


İki iş yapmak zorundasınız: 1. dil seçin 2. libstdc olarak bazı kütüphane suhch seçin ++
PersianGulf

-1

gcc ve g ++ her ikisi de GNU derleyicisidir. Her ikisi de c ve c ++ derler. Fark * .c dosyaları için gcc onu ac programı olarak ele alır ve g ++ onu ac ++ programı olarak görür. * .cpp dosyaları c ++ programları olarak kabul edilir. c ++, c'nin süper bir kümesidir ve sözdizimi daha katıdır, bu nedenle sonek konusunda dikkatli olun.


1
C ++, C'nin katı bir üst kümesi değil, farklı bir dildir, bu nedenle yanlış hedef dille derlemek beklenmedik sonuçlar doğurabilir. Ayrıca, yalnızca C ++ dosya adı uzantısı olarak g++yorumlanacağını da unutmayın .cc.
underscore_d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.