ความแตกต่างระหว่าง g ++ และ gcc คืออะไร?


875

ความแตกต่างระหว่าง g ++ และ gcc คืออะไร? ควรใช้อันไหนในการพัฒนา c ++ ทั่วไป?


g ++ => c ++ compiler gcc => c compiler
Nagappa

คำตอบ:


727

gccและg++เป็นไดรเวอร์คอมไพเลอร์ของ GNU Compiler Collection (ซึ่งครั้งหนึ่งกาลครั้งหนึ่งนานแค่ GNU C Compiler )

แม้ว่าพวกเขาจะกำหนดแบ็กเอนด์ ( cc1 cc1plus... ) ที่จะโทรโดยอัตโนมัติขึ้นอยู่กับประเภทไฟล์เว้นแต่จะถูกแทนที่ด้วย-x languageแต่ก็มีความแตกต่างกันบ้าง

ความแตกต่างที่สำคัญที่สุดในค่าเริ่มต้นคือไลบรารีใดที่พวกเขาเชื่อมโยงโดยอัตโนมัติ

ตาม GCC ออนไลน์เอกสารตัวเลือกการเชื่อมโยงและวิธีการที่ก. ++ จะเรียก , g++เทียบเท่ากับgcc -xc++ -lstdc++ -shared-libgcc(1 เป็นตัวเลือกที่คอมไพเลอร์ที่ 2 ทั้งสองเป็นตัวเลือกลิงเกอร์) สิ่งนี้สามารถตรวจสอบได้ด้วยการรันทั้งสองด้วย-vตัวเลือก (มันแสดงคำสั่งแบ็คเอนด์ Toolchain ที่กำลังทำงาน)


13
จากคำตอบนี้ฉันสรุปได้อย่างมีประสิทธิภาพว่าคำสั่ง g ++ เป็นเพียง gcc พร้อมกับแฟล็ก .. เหตุใดจึงมีไบนารีที่แตกต่างกันสองขนาด (ประมาณขนาดเท่ากัน) สำหรับ gcc และ g ++ ใน linux เราไม่ควรมีเพียงหนึ่งไบนารีและ symlink เดียว (หรือบางอย่างตามเส้นเหล่านั้น)?
UchihaItachi

9
@Uchihaltachi ไฟล์เหล่านี้เป็นลิงค์ยากและเมื่อพวกเขาบูทขึ้นพวกเขาตรวจสอบargv[0]เพื่อดูว่าควรใช้การขอร้องใด นี่เป็นเรื่องปกติในหมู่ยูทิลิตี UNIX หลัก
เพลิดเพลินกับ

438

GCC: GNU Compiler Collection

  • อ้างอิงถึงภาษาต่าง ๆ ทั้งหมดที่ GNU คอมไพเลอร์สนับสนุน

gcc: คอมไพเลอร์
g++GNU C: คอมไพเลอร์GNU C ++

ความแตกต่างหลัก:

  1. gccจะรวบรวม: *.c\*.cppไฟล์เป็น C และ C ++ ตามลำดับ
  2. g++จะคอมไพล์: *.c\*.cppไฟล์ แต่ทั้งหมดจะถูกใช้เป็นไฟล์ C ++
  3. นอกจากนี้หากคุณใช้g++เพื่อเชื่อมโยงไฟล์วัตถุมันจะลิงก์โดยอัตโนมัติในไลบรารี std C ++ ( gccไม่ได้ทำสิ่งนี้)
  4. gcc การคอมไพล์ไฟล์ C มีมาโครที่กำหนดไว้ล่วงหน้าน้อยลง
  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

37
คุณสามารถลิงก์ไลบรารี std C ++ ได้gccโดยผ่าน-lstdc++พารามิเตอร์
Denilson Sá Maia

16
มีความแตกต่างมากขึ้นระหว่างนี้ 'gcc' และ 'กรัม ++ กว่าเพียงห้องสมุดมาตรฐานดังนั้นจะยังคงไม่ได้รับคุณพฤติกรรมเช่นเดียวกับgcc -lstdc++ g++เราใส่พฤติกรรมเฉพาะภาษานั้นไว้ในไดรเวอร์ของตัวเองด้วยเหตุผลนั่นคือสิ่งที่มันทำไว้ :-)
Ti Strga

8
ความคิดเห็นของฉันไม่ได้พูดถึงเพียงการเชื่อมโยง ... นั่นคือประเด็น แม้เพียงแค่ จำกัด การอภิปรายเพื่อเชื่อมโยง (ซึ่งคำตอบของคุณไม่ใช่) ผู้ใช้ยังคงไม่สามารถใช้ไลบรารีมาตรฐาน C ++ ทั้งหมดโดยการระบุเพียงอย่างเดียว-lstdc++เนื่องจากจะไม่มีการพึ่งพาข้อมูลทางคณิตศาสตร์ RTTI และข้อยกเว้น การเชื่อมโยงกรณีทดสอบที่ระบุหรือล้มเหลวจะขึ้นอยู่กับระบบปฏิบัติการและคุณลักษณะของ C ++ ที่ใช้โดยกรณีทดสอบซึ่งอีกครั้งคือสาเหตุที่ความรู้ทั้งหมดนั้นถูกสร้างขึ้นในไดรเวอร์ g ++ แทนที่จะเป็นผู้ใช้ที่เหลือ .
Ti Strga

10
เชื่อใจฉันเรามีการสนทนานี้มากมายโดยปกติเมื่อผู้ใช้ Linux พยายามย้าย Makefile ที่ไม่สมบูรณ์ของเขาไปยังแพลตฟอร์มอื่น :-) เวทีเชื่อมโยง g ++ ทำหน้าที่ได้มากกว่าgcc -lstdc++ในระบบปฏิบัติการอื่น ๆ โดยเฉพาะอย่างยิ่งเมื่อเป้าหมายนั้นเป็นแพลตฟอร์มแบบฝัง โชคดีที่นั่นเป็นเหตุผลที่เราจัดส่ง g ++ ในตอนแรก
Ti Strga

10
สตริงข้อมูลจำเพาะถูกสร้างเพื่อให้มีความเฉพาะเจาะจงกับคอมไพเลอร์ซึ่งเป็นข้อมูลเฉพาะสำหรับระบบปฏิบัติการและเป้าหมาย ดังนั้นหากคุณเรียกใช้-dumpspec(ตัวอย่าง) cross compiler ที่กำหนดเป้าหมายระบบฝังตัวคุณจะเห็นความแตกต่าง มีมากกว่าเพียงความแตกต่าง linker ... ซึ่งอีกครั้งเป็นสิ่งที่คำตอบของคุณเป็นเรื่องเกี่ยวกับ (มาโครโปรเซสเซอร์ก่อนรวมเส้นทาง, ห้องสมุดหลายรันไทม์) ดูเหมือนว่าเราจะพูดคุยกัน แต่ในฐานะผู้ดูแล GCC ในอดีตฉันรับรองว่าฉันคุ้นเคยกับสิ่งที่เป็นส่วนหน้าและไม่ใช่
Ti Strga

82

สำหรับ c ++ คุณควรใช้ g ++

มันเป็นคอมไพเลอร์เดียวกัน (เช่นคอลเลกชันคอมไพเลอร์ GNU) GCC หรือ G ++ เพียงเลือก front-end ที่แตกต่างกันพร้อมตัวเลือกเริ่มต้นที่แตกต่างกัน

สั้น: ถ้าคุณใช้ g ++ ส่วนหน้าจะบอก linker ว่าคุณอาจต้องการที่จะเชื่อมโยงกับห้องสมุดมาตรฐาน C ++ ส่วนต่อท้าย gcc จะไม่ทำเช่นนั้น (และสามารถเชื่อมโยงกับพวกมันได้หากคุณผ่านตัวเลือกบรรทัดคำสั่งที่ถูกต้อง)


3
+1 ด้วยหน้า GNC / GNU ของฉัน GNU / Linux ของฉันบอกว่า "เมื่อคุณรวบรวมโปรแกรม C ++ คุณควรเรียกใช้ GCC เป็น g ++ แทน"
มุมมองรูปไข่

35

ความแตกต่างระหว่างg++และgccคืออะไร?

gccได้พัฒนาจากภาษาเดียว "GNU C Compiler" เป็น "GNU Compiler Collection" หลายภาษา คำว่า "GNU C Compiler" บางครั้งยังคงใช้ในบริบทของการเขียนโปรแกรม C

g++ เป็น c ++ คอมไพเลอร์สำหรับเก็บสะสม GNU เหมือนเป็นคอมไพเลอร์สำหรับgnat Ada ดูการใช้ GNU Compiler Collection (GCC)gcc

ตัวอย่างเช่นman g++คำสั่งUbuntu 16.04 และ 18.04 ส่งคืนGCC(1)หน้าคู่มือ

Ubuntu 16.04 และ 18.04 man gccระบุว่า ...

g++ ยอมรับตัวเลือกส่วนใหญ่เช่นเดียวกับ gcc

และเป็นค่าเริ่มต้น ...

... การใช้gccไม่เพิ่มไลบรารี C ++ g++เป็นโปรแกรมที่เรียก GCC และระบุการลิงก์กับไลบรารี C ++ โดยอัตโนมัติ โดยจะถือว่าไฟล์. c, .h และ. i เป็นไฟล์ต้นฉบับ C ++ แทนไฟล์ต้นฉบับ C ยกเว้นว่าใช้ -x โปรแกรมนี้ยังมีประโยชน์เมื่อทำการคอมไพล์ไฟล์ส่วนหัว C ด้วยส่วนขยาย. h เพื่อใช้ในการคอมไพล์ C ++

ค้นหาgccหน้าคนสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกที่แปรปรวนระหว่างและ gccg++

ควรใช้อันไหนสำหรับการพัฒนา c ++ ทั่วไป?

เทคนิคการอย่างใดอย่างหนึ่งgccหรือg++สามารถนำมาใช้สำหรับ C ++ ทั่วไปการพัฒนาด้วยการตั้งค่าตัวเลือกบังคับ อย่างไรก็ตามg++พฤติกรรมเริ่มต้นจะถูกจัดชิดกับการพัฒนา C ++ ตามธรรมชาติ

หน้าคน Ubuntu 18.04เพิ่มวรรคต่อไปนี้:

วิธีปกติในการเรียกใช้ GCC คือการเรียกใช้โปรแกรมเรียกใช้gccหรือmachine-gccเมื่อทำการรวบรวมแบบข้ามหรือmachine-gcc-versionเพื่อเรียกใช้ GCC รุ่นที่ระบุ เมื่อคุณรวบรวมโปรแกรม C ++ คุณควรเรียกใช้ GCC g++แทน


21

ข้อแตกต่างที่น่าสังเกตคือถ้าคุณส่ง.cไฟล์ไปยัง gcc มันจะคอมไพล์เป็น C

พฤติกรรมเริ่มต้นของ g ++ คือการปฏิบัติต่อ.cไฟล์เป็น C ++ (เว้นแต่-x cจะระบุไว้)


19
(สาย แต่สำหรับลูกหลาน) ในขณะที่คำตอบอื่น ๆ ได้ชี้ให้เห็นนี่คือไม่ได้หมายความว่า "ความแตกต่างที่โดดเด่นเท่านั้น" เว้นแต่ผู้อ่านมีคำจำกัดความของความโดดเด่นเบ้
underscore_d

16

แม้ว่าคำสั่ง gcc และ g ++ จะทำสิ่งที่คล้ายกันมาก แต่ g ++ ได้รับการออกแบบให้เป็นคำสั่งที่คุณเรียกใช้เพื่อคอมไพล์โปรแกรม C ++; มีวัตถุประสงค์เพื่อทำสิ่งที่ถูกต้องโดยอัตโนมัติ

เบื้องหลังโปรแกรมนี้เป็นโปรแกรมเดียวกันจริง ๆ ตามที่ฉันเข้าใจทั้งคู่ตัดสินใจว่าจะคอมไพล์โปรแกรมเป็น C หรือเป็น C ++ ตามนามสกุลไฟล์ ทั้งสองมีความสามารถในการเชื่อมโยงกับไลบรารีมาตรฐาน C ++ แต่เฉพาะ g ++ ทำตามค่าเริ่มต้น ดังนั้นหากคุณมีโปรแกรมที่เขียนใน C ++ ซึ่งไม่จำเป็นต้องเชื่อมโยงกับไลบรารีมาตรฐาน gcc จะเกิดขึ้นเพื่อทำสิ่งที่ถูกต้อง แต่จากนั้น g ++ จะเป็นเช่นนั้น ดังนั้นจึงไม่มีเหตุผลที่จะไม่ใช้ g ++ สำหรับการพัฒนา C ++ ทั่วไป


12

ฉันสนใจเรื่องนี้และทำการทดลองบางอย่าง

  1. ฉันพบคำอธิบายที่นี่แต่สั้นมาก

  2. จากนั้นฉันพยายามทดสอบด้วย gcc.exe และ g ++. exe บนเครื่อง windows:

    $ 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, collect2.exe, as.exe, ld.exe

  2. gcc ทำงานได้ดีเป็น metatool หากคุณมีส่วนขยายที่ถูกต้องหรือตั้งค่าสถานะที่ถูกต้อง ดูนี่สิ


9

“ GCC” เป็นคำศัพท์ย่อทั่วไปสำหรับ GNU Compiler Collection นี่คือทั้งชื่อสามัญที่สุดสำหรับคอมไพเลอร์และชื่อที่ใช้เมื่อมีการเน้นในการรวบรวมโปรแกรม C (เมื่อก่อนหน้านี้ย่อมาจาก "GNU C Compiler")

เมื่ออ้างถึงการคอมไพล์ C ++ เป็นเรื่องปกติที่จะเรียกคอมไพเลอร์“ G ++” เนื่องจากมีคอมไพเลอร์เพียงตัวเดียวจึงถูกต้องที่จะเรียกมันว่า "GCC" ไม่ว่าบริบทของภาษาจะเป็นอย่างไร อย่างไรก็ตามคำว่า“ G ++” มีประโยชน์มากกว่าเมื่อเน้นการคอมไพล์โปรแกรม C ++

คุณสามารถอ่านรายละเอียดเพิ่มเติมที่นี่


0

ฉันกำลังทดสอบ gcc และ g ++ ในระบบ linux โดยใช้ MAKEFILE ฉันสามารถกำหนดผู้ใช้ที่ใช้ "GNU make" ได้ ฉันทดสอบด้วยคุณสมบัติการค้นหาตำแหน่ง "หน่วยความจำแบบไดนามิก" ของ "C plus plus" โดย:

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 บวกบวก" อย่างเต็มที่ ดูเหมือนว่าการเลือก g ++ สำหรับไฟล์ต้นฉบับ C ++ เป็นตัวเลือกที่ดีกว่า


คุณต้องทำงานสองอย่าง: 1. เลือกภาษา 2. เลือกไลบรารี suhch เป็น libstdc ++
PersianGulf

-1

gcc และ g ++ เป็นคอมไพเลอร์ GNU พวกเขาทั้งสองรวบรวม c และ c ++ ข้อแตกต่างสำหรับไฟล์ * .c gcc ถือเป็นโปรแกรม ac และ g ++ เห็นว่าเป็นโปรแกรม ac ++ ไฟล์ * .cpp ถือเป็นโปรแกรม c ++ c ++ เป็นชุดสุดของ c และไวยากรณ์มีความเข้มงวดมากขึ้นดังนั้นควรระมัดระวังเกี่ยวกับคำต่อท้าย


1
C ++ เป็นภาษาที่แตกต่างไม่ใช่ superset ที่เข้มงวดของ C ดังนั้นการรวบรวมด้วยภาษาเป้าหมายที่ไม่ถูกต้องอาจทำให้ได้ผลลัพธ์ที่ไม่คาดคิด โปรดทราบด้วยว่าg++จะแปล.ccเป็น C ++ - เฉพาะส่วนขยายชื่อไฟล์
underscore_d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.