G ++ සහ gcc අතර වෙනස කුමක්ද?


Answers:


741

gccහා g++යනු GNU Compiler ක සම්පාදක-රියදුරන් එකතුව (අ කාලය පමණක් GNU මත වරක් වූ C කම්පයිලරය ).

cc1 cc1plusලිපිගොනු වර්ගය අනුව කුමන පසුබිම් ( ...) ඇමතිය යුතුද යන්න ඔවුන් ස්වයංක්‍රීයව තීරණය කළද, ඒවා ඉක්මවා නොගියහොත් -x languageඔවුන්ට යම් වෙනස්කම් තිබේ.

ඔවුන්ගේ පෙරනිමි වල වඩාත්ම වැදගත් වෙනස වන්නේ ඒවා ස්වයංක්‍රීයව සම්බන්ධ වන පුස්තකාලයන් ය.

ගල්ෆ් අන්තර්ජාල ප්රලේඛනය අනුව ලින්ක් විකල්ප සහ ආකාරය ග්රෑම් ++ පළ කළහ ඇත , g++සමාන වේ gcc -xc++ -lstdc++ -shared-libgcc(1 වන සම්පාදක විකල්පය වන අතර, 2 වන දෙකක් linker විකල්ප). -vවිකල්පය සමඟ දෙකම ධාවනය කිරීමෙන් මෙය පරීක්ෂා කළ හැකිය (එය ක්‍රියාත්මක වන පසුබිම් මෙවලම් දාම විධාන පෙන්වයි).


15
මෙම පිළිතුරෙන් මම නිගමනය කරන්නේ g ලදායී ලෙස g ++ විධානය කොඩි පොකුරක් සහිත gcc පමණක් බවයි .. එසේනම් ලිනක්ස් හි gcc සහ g ++ සඳහා වෙනස් ද්විමය (ආසන්න වශයෙන් එකම ප්‍රමාණයෙන්) ඇත්තේ ඇයි? අපට ඇත්තේ ද්විමය හා එක් සිම්ලින්ක් (හෝ එම රේඛා ඔස්සේ යමක්) පමණක් නොවේද?
උචිහා ඉටාචි

9
Chi උචිහාල්ටාචි මෙම ලිපිගොනු දෘ link සබැඳි වන අතර ඒවා ආරම්භ වූ විට argv[0]කුමන ආයාචනය භාවිතා කළ යුතුදැයි පරීක්ෂා කරයි. මූලික යුනික්ස් උපයෝගිතා අතර මෙය බෙහෙවින් පොදු ය.

447

GCC: GNU සම්පාදක එකතුව

  • GNU සම්පාදකයා විසින් සහාය දක්වන විවිධ භාෂා වෙත යොමු කරන්නන්.

gcc: GNU C Compiler
g++: GNU C ++ Compiler

ප්රධාන වෙනස්කම්:

  1. gccසම්පාදනය කරනු ඇත: *.c\*.cppගොනු පිළිවෙලින් C සහ C ++ ලෙස.
  2. g++ සම්පාදනය කරනු ඇත: *.c\*.cpp ගොනු නමුත් ඒවා සියල්ලම C ++ ගොනු ලෙස සලකනු ලැබේ.
  3. ඔබ g++වස්තු ලිපිගොනු සම්බන්ධ කිරීමට භාවිතා කරන්නේ නම් එය ස්වයංක්‍රීයව std C ++ පුස්තකාලවලට සම්බන්ධ වේ (මෙය gccනොකරයි).
  4. gcc සී ගොනු සම්පාදනය කිරීමේදී පූර්ව නිශ්චිත මැක්‍රෝස් අඩුය.
  5. gccගොනු සම්පාදනය කිරීම *.cppහා g++සම්පාදනය *.c\*.cppකිරීම සඳහා අමතර මැක්‍රෝ කිහිපයක් ඇත.

*.cppලිපිගොනු සම්පාදනය කිරීමේදී අමතර මැක්‍රෝස් :

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

38
පරාමිතිය gccපසු කිරීමෙන් ඔබට std C ++ පුස්තකාලය සම්බන්ධ කළ හැකිය -lstdc++.
ඩෙනිල්සන් එස් මායා

16
සම්මත පුස්තකාලවලට වඩා 'gcc' සහ 'g ++' අතර වැඩි වෙනස්කම් gcc -lstdc++ඇත , එබැවින් තවමත් ඔබට සමාන හැසිරීමක් නොලැබෙනු ඇත g++. අපි එම භාෂාවට විශේෂිත වූ හැසිරීම් සියල්ලම එහි රියදුරු තුළට දමන්නේ හේතුවක් ඇතුවයි. :-)
Ti Strga

8
මගේ අදහස කතා කිරීම හුදෙක් සම්බන්ධ කිරීම ගැන නොවේ ... එයයි කාරණය. සාකච්ඡාව සම්බන්ධ කිරීම සඳහා පමණක් සීමා කිරීම (ඔබේ පිළිතුර නොවූ), පරිශීලකයෙකි-lstdc++ගණිතය, ආර්ටීටීඅයි සහ ව්‍යතිරේක තොරතුරු මත යැපීම් නැති වී තවමත් නියම කිරීමෙන් පමණක් සම්පූර්ණ සී ++ සම්මත පුස්තකාලය භාවිතා කළ නොහැක . ලබා දී ඇති ටෙස්ට් කේස් සබැඳි හෝ අසමත් වන්නේ මෙහෙයුම් පද්ධතිය මත වන අතර ටෙස්ට් කේස් විසින් භාවිතා කරනු ලබන සී ++ විශේෂාංග මත රඳා පවතී, එම නිසා නැවතත් එම දැනුම සියල්ලම පරිශීලකයාට භාර දීම වෙනුවට ජී ++ ධාවකයට ගොඩනගා ඇත. .
Ti Strga

10
මාව විශ්වාස කරන්න, අපට මෙම සාකච්ඡාව බොහෝ ඇත, සාමාන්‍යයෙන් ලිනක්ස් පරිශීලකයෙකු සිය අසම්පූර්ණ Makefile වෙනත් වේදිකාවක් වෙත ගෙන යාමට උත්සාහ කරන විට. :-) g ++ සම්බන්ධක අදියර ඊට වඩා බොහෝ දේ කරයිgcc -lstdc++ අනෙකුත් මෙහෙයුම් පද්ධති , විශේෂයෙන් ඉලක්කය කාවැද්දූ වේදිකාවක් වන විට. වාසනාවකට මෙන්, අපි මුලින් g ++ නැව්ගත කරන්නේ එබැවිනි.
Ti Strga

10
පිරිවිතර නූල් සම්පාදකයාට විශේෂිත වන පරිදි ඉදිකර ඇති අතර එය මෙහෙයුම් පද්ධතියට සහ ඉලක්කයට විශේෂිත වේ. එබැවින් ඔබ -dumpspecකාවැද්දූ පද්ධතියක් ඉලක්ක කර ගත් හරස් සම්පාදකයෙකු මත ධාවනය කරන්නේ නම් , ඔබට වෙනස්කම් පෙනෙනු ඇත. සම්බන්ධක වෙනස්කම් වලට වඩා වැඩි යමක් ඇත ... නැවතත්, ඔබේ පිළිතුර වූයේ එයයි (පෙර සැකසුම් මැක්‍රෝස්, මාර්ග, බහු ධාවන පුස්තකාල ඇතුළත්). අපි එකිනෙකා පසුකරමින් සිටින බවක් පෙනේ, නමුත් හිටපු ජීසීසී නඩත්තුකරුවෙකු ලෙස, මම ඔබට සහතික වෙමි, පෙරටුගාමී දේ සහ නැති දේ ගැන මම හොඳින් දනිමි.
Ti Strga

85

C ++ සඳහා ඔබ g ++ භාවිතා කළ යුතුය.

එය එකම සම්පාදකයෙකි (උදා: GNU සම්පාදක එකතුව). GCC හෝ G ++ වෙනස් පෙරනිමි විකල්පයන් සහිත වෙනස් ඉදිරිපස කෙළවරක් තෝරන්න.

කෙටියෙන් කිවහොත්: ඔබ g ++ භාවිතා කරන්නේ නම්, C ++ සම්මත පුස්තකාල සමඟ සම්බන්ධ වීමට ඔබට අවශ්‍ය විය හැකි බව ෆ්‍රොන්ටෙන්ඩ් සම්බන්ධකයට කියයි. Gcc frontend එය නොකරනු ඇත (ඔබ නිවැරදි විධාන රේඛා විකල්පයන් සමත් වුවහොත් එය ඔවුන් සමඟ සම්බන්ධ විය හැකිය).


3
+1 එසේම මගේ GNU / Linux gcc man පිටුවෙහි, "ඔබ C ++ වැඩසටහන් සම්පාදනය කරන විට, ඒ වෙනුවට GCC ලෙස GCC ලෙස ආයාචනා කළ යුතුය."
ඉලිප්සාකාර දසුන

38

g++සහ අතර ඇති වෙනස gccකුමක්ද?

gcc"GNU C Compiler" යන තනි භාෂාවෙන් පරිණාමය වී ඇත්තේ බහු භාෂා "GNU Compiler Collection" ලෙසිනි. "GNU C Compiler" යන පදය සමහර විට C වැඩසටහන්කරණයේ සන්දර්භය තුළ භාවිතා වේ.

මෙම g++ වන යනු GNU Compiler එකතුව සඳහා C ++ compiler. gnatඇඩා ​​සම්පාදකයා මෙන් gcc. GNU Compiler Collection (GCC) භාවිතා කිරීම බලන්න

උදාහරණයක් ලෙස, උබුන්ටු 16.04 සහ 18.04 man g++විධානය මඟින් GCC(1)අත්පොත පිටුව ලබා දෙයි.

උබුන්ටු 16.04 සහ 18.04 හි man gccසඳහන් වන්නේ ...

g++ බොහෝ දුරට එකම විකල්පයන් පිළිගනී gcc

සහ පෙරනිමිය ...

... භාවිතය gccC ++ පුස්තකාලය එක් නොකරයි. g++යනු GCC ලෙස හඳුන්වන වැඩසටහනක් වන අතර C ++ පුස්තකාලයට සම්බන්ධ වීම ස්වයංක්‍රීයව නියම කරයි. -X භාවිතා නොකරන්නේ නම් එය C ප්‍රභව ගොනු වෙනුවට .c, .h සහ .i ගොනු C ++ ප්‍රභව ගොනු ලෙස සලකයි. C ++ සම්පාදනයන් සඳහා භාවිතා කිරීම සඳහා .h දිගුවක් සහිත C ශීර්ෂ ගොනුවක් පූර්ව සම්පාදනය කිරීමේදී මෙම වැඩසටහන ප්‍රයෝජනවත් වේ.

සහ gccඅතර ඇති විකල්ප විචල්‍යයන් පිළිබඳ වැඩි විස්තර සඳහා මෑන් පිටු සොයන්න .gccg++

සාමාන්‍ය c ++ සංවර්ධනය සඳහා භාවිතා කළ යුත්තේ කුමක්ද?

තාක්ෂණික වශයෙන්, අදාළ විකල්ප සැකසුම් සමඟ සාමාන්‍ය C ++ සංවර්ධනය සඳහා gccහෝ g++භාවිතා කළ හැකිය. කෙසේ වෙතත්, g++පෙරනිමි හැසිරීම ස්වාභාවිකවම C ++ සංවර්ධනයකට පෙළ ගැසී ඇත.

මෙම උබුන්ටු 18,04 'gcc' man පිටුව එක් කල, සහ උබුන්ටු 20,04 , ඇති දිගින් දිගටම ඒ සඳහා පහත සඳහන් ඡේදය:

GCC ධාවනය කිරීම සඳහා සුපුරුදු ක්‍රමය නම් gcc, ක්‍රියාත්මක කළ හැකි කැඳවීම , හෝ machine-gccහරස් සම්පාදනය කිරීමේදී හෝ machine-gcc-versionGCC හි නිශ්චිත අනුවාදයක් ධාවනය කිරීමයි. ඔබ C ++ වැඩසටහන් සම්පාදනය කරන විට, g++ඒ වෙනුවට GCC කැඳවිය යුතුය .


24

සැලකිය යුතු වෙනසක් නම්, ඔබ .cගොනුවක් gcc වෙත යැවුවහොත් එය C ලෙස සම්පාදනය වේ.

G ++ හි පෙරනිමි හැසිරීම නම් .cගොනු C ++ ලෙස සැලකීමයි ( -x cනිශ්චිතව දක්වා නොමැති නම්).


19
(ප්‍රමාද වූ නමුත් පසු පරම්පරාව සඳහා) වෙනත් පිළිතුරු පෙන්වා දී ඇති පරිදි මෙය කිසිසේත්ම “එකම කැපී පෙනෙන වෙනස” නොවේ.
underscore_d

17

Gcc සහ g ++ විධානයන් බොහෝ සමාන දේ කළත්, g ++ නිර්මාණය කර ඇත්තේ C ++ වැඩසටහනක් සම්පාදනය කිරීමට ඔබ ඉල්ලා සිටින විධානය ලෙස ය; එය ස්වයංක්‍රීයව නිවැරදි දේ කිරීමට අදහස් කරයි.

තිරය ​​පිටුපස, ඔවුන් ඇත්ත වශයෙන්ම එකම වැඩසටහනකි. මා තේරුම් ගත් පරිදි, ගොනු නාම දිගුව මත පදනම්ව වැඩසටහනක් C ලෙස හෝ C ++ ලෙස සම්පාදනය කළ යුතුද යන්න දෙදෙනාම තීරණය කරයි. දෙකම C ++ සම්මත පුස්තකාලයට සම්බන්ධ කිරීමට හැකියාව ඇත, නමුත් පෙරනිමියෙන් මෙය කරන්නේ g ++ පමණි. එබැවින් ඔබට සම්මත පුස්තකාලයට සම්බන්ධ වීමට අවශ්‍ය නොවන C ++ හි ලියා ඇති වැඩසටහනක් තිබේ නම්, නිවැරදි දේ කිරීමට gcc සිදුවනු ඇත; නමුත් එසේ නම් g ++ ද එසේ වනු ඇත. එබැවින් සාමාන්‍ය C ++ සංවර්ධනය සඳහා g ++ භාවිතා නොකිරීමට කිසිදු හේතුවක් නැත.


13

මම ගැටලුව ගැන උනන්දු වී අත්හදා බැලීම් කිහිපයක් කළෙමි

  1. මට එම විස්තරය මෙහි හමු විය , නමුත් එය ඉතා කෙටි ය.

  2. ඉන්පසු මම මගේ වින්ඩෝස් යන්ත්‍රයේ gcc.exe සහ g ++ exe සමඟ අත්හදා බැලීමට උත්සාහ කළෙමි:

    $ 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, සහ c ++ 1998 සරල පරීක්ෂණ ලිපිගොනු සම්පාදනය කිරීමට උත්සාහ කළ අතර එය භාෂාවට ගැලපෙන නිවැරදි දිගු සමඟ මට හොඳින් ක්‍රියා කරයි

    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. නමුත් මම "gnu compiler collection" මෙවලම එම ආකාරයෙන් ක්‍රියාත්මක කිරීමට උත්සාහ කරන විට:

    $ 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. නමුත් මෙය තවමත් කිසිදු දෝෂයකින් තොරව ක්‍රියා කරයි

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. මෙයද

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

ps ගොනු පරීක්ෂා කරන්න

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

සොයා ගැනීම්:

  1. ක්‍රියාවලි ගස දෙස බැලුවහොත්, gcc, සහ g ++ වෙනත් මෙවලම් වලට පිටුබලය වන බව පෙනේ, ඒවා මගේ පරිසරයේ: cc1plus.exe, cc1.exe, collection2.exe, as.exe, ld.exe

  2. ඔබට නිවැරදි දිගුවක් තිබේ නම් හෝ නිවැරදි -std -x ධජ සකසා ඇත්නම් gcc මෙටටූල් ලෙස හොඳින් ක්‍රියා කරයි. මෙය බලන්න


9

“GCC” යනු GNU සම්පාදක එකතුව සඳහා පොදු කෙටිමං යෙදුමකි. මෙය සම්පාදකයාගේ වඩාත් පොදු නම වන අතර, සී වැඩසටහන් සම්පාදනය කිරීම සඳහා අවධාරණය කරන විට භාවිතා කරන නම (කලින් කෙටියෙන් දැක්වෙන්නේ “ග්නූ සී කම්පයිලර්” යන්නයි).

C ++ සම්පාදනය ගැන සඳහන් කිරීමේදී, සම්පාදකයා “G ++” ලෙස හැඳින්වීම සාමාන්‍ය දෙයකි. එක් සම්පාදකයෙකු පමණක් සිටින බැවින්, භාෂා සන්දර්භය කුමක් වුවත් එය “GCC” ලෙස හැඳින්වීම නිවැරදි ය; කෙසේ වෙතත්, C ++ වැඩසටහන් සම්පාදනය කිරීමට අවධාරණය කරන විට “G ++” යන පදය වඩාත් ප්‍රයෝජනවත් වේ.

ඔබට මෙහි වැඩිදුර කියවිය හැකිය .


0

මම ලිනක්ස් පද්ධතියක gcc සහ g ++ පරීක්ෂා කරමින් සිටියෙමි. MAKEFILE භාවිතා කිරීමෙන්, මට "GNU make" භාවිතා කරන සම්පාදකය අර්ථ දැක්විය හැකිය. "සී ප්ලස් ප්ලස්" හි ඊනියා "ගතික මතකය" ස්ථානගත කිරීමේ ලක්ෂණයෙන් මම පරීක්ෂා කළේ:

int main(){

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

මගේ පරිගණකයේ සාර්ථකව සම්පාදනය කළ හැක්කේ g ++ ට පමණක් වන අතර gcc දෝෂය වාර්තා කරයි

undefined reference to `operator new(unsigned long)'

එබැවින් මගේම නිගමනය වන්නේ gcc "C plus plus" සඳහා පූර්ණ සහය නොදක්වන බවයි. C ++ ප්‍රභව ගොනු සඳහා g ++ තෝරා ගැනීම වඩා හොඳ විකල්පයක් බව පෙනේ.


ඔබට කාර්යයන් දෙකක් කළ යුතුය: 1. භාෂාව තෝරන්න 2. පුස්තකාල සුහ්ච් libstdc ++ ලෙස තෝරන්න
පර්සියානු ගල්ෆ්

-1

gcc සහ g ++ යන දෙකම GNU සම්පාදක වේ. ඔවුන් දෙදෙනාම c සහ c ++ සම්පාදනය කරයි. වෙනස වන්නේ * .c ගොනු සඳහා gcc එය ac වැඩසටහනක් ලෙස සලකන අතර g ++ එය ac ++ වැඩසටහනක් ලෙස සලකයි. * .cpp ගොනු c ++ වැඩසටහන් ලෙස සැලකේ. c ++ යනු c හි සුපිරි කට්ටලයක් වන අතර වාක්‍ය ඛණ්ඩය වඩාත් දැඩි බැවින් උපසර්ගය ගැන සැලකිලිමත් වන්න.


1
C ++ යනු වෙනස් භාෂාවක් වන අතර එය C හි දැඩි සුපර්සෙට් එකක් නොවේ, එබැවින් වැරදි ඉලක්කගත භාෂාව සමඟ සම්පාදනය කිරීමෙන් අනපේක්ෂිත ප්‍රති .ල ලැබෙනු ඇත. එය C ++ - පමණක් ගොනු නාම දිගුවක් ලෙස g++අර්ථ .ccදැක්විය හැකි බව සලකන්න .
underscore_d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.