G ++ ve gcc arasındaki fark nedir? Bunlardan hangisi genel c ++ gelişimi için kullanılmalıdır?
G ++ ve gcc arasındaki fark nedir? Bunlardan hangisi genel c ++ gelişimi için kullanılmalıdır?
Yanıtlar:
gcc
ve bir zamanlar sadece GNU C Derleyicisi olan g++
GNU Derleyici Koleksiyonunun derleyici sürücüleri .
cc1
cc1plus
Dosya 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 -v
seçenekle de çalıştırılabilir (çalıştırılan arka uç araç zinciri komutlarını görüntüler).
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.
GCC: GNU Derleyici Koleksiyonu
gcc
: GNU C Derleyici
g++
: GNU C ++ Derleyici
Temel farklar:
gcc
derler: *.c\*.cpp
dosyaları sırasıyla C ve C ++.g++
: *.c\*.cpp
dosyaları derleyecek, ancak hepsi C ++ dosyaları olarak değerlendirilecektir.g++
nesne dosyalarını bağlamak için kullanırsanız , std C ++ kitaplıklarına otomatik olarak bağlanır ( gcc
bunu yapmaz).gcc
C dosyalarını derlemek daha az önceden tanımlanmış makroya sahiptir.gcc
dosyaları derlemek *.cpp
ve g++
derlemek *.c\*.cpp
birkaç ekstra makroya sahiptir.*.cpp
Dosyaları derlerken fazladan Makrolar :
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
ileterek bağlayabilirsiniz -lstdc++
.
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. :-)
-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. .
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.
-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.
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).
Arasındaki fark nedir g++
ve gcc
?
gcc
tek 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 gnat
iç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 edergcc
ve varsayılan ...
... kullanımı
gcc
C ++ 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 gcc
arasındaki seçenek farkları hakkında daha fazla bilgi için kılavuz sayfalarında arama yapın . gcc
g++
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 gcc
veya 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ı
gcc
veyamachine-gcc
çapraz derleme yaparken veyamachine-gcc-version
GCC'nin belirli bir sürümünü çalıştırmaktır. C ++ programlarını derlerken GCC'yi bunung++
yerine çağırmalısınız .
Önemli bir fark, bir .c
dosyayı gcc'ye iletirseniz C olarak derlenmesidir.
G ++ 'nın varsayılan davranışı, .c
dosyalara C ++ (aksi -x c
belirtilmedikçe) olarak davranmaktır .
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.
Konuya ilgi duymaya başladım ve bazı deneyler yaptım
Bu açıklamayı burada buldum , ama çok kısa.
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
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
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]
Ama bu hala hatasız çalışıyor
$ gcc -x c++ -std=c++98 test_cpp.c
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:
İş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
gcc, doğru uzantıya sahipseniz veya doğru -std -x bayraklarını ayarladıysanız meta araç olarak iyi çalışır. Bkz bu
“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 .
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.
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.
g++
yorumlanacağını da unutmayın .cc
.