ความแตกต่างระหว่าง g ++ และ gcc คืออะไร? ควรใช้อันไหนในการพัฒนา c ++ ทั่วไป?
ความแตกต่างระหว่าง g ++ และ gcc คืออะไร? ควรใช้อันไหนในการพัฒนา c ++ ทั่วไป?
คำตอบ:
gccและg++เป็นไดรเวอร์คอมไพเลอร์ของ GNU Compiler Collection (ซึ่งครั้งหนึ่งกาลครั้งหนึ่งนานแค่ GNU C Compiler )
แม้ว่าพวกเขาจะกำหนดแบ็กเอนด์ ( cc1 cc1plus... ) ที่จะโทรโดยอัตโนมัติขึ้นอยู่กับประเภทไฟล์เว้นแต่จะถูกแทนที่ด้วย-x languageแต่ก็มีความแตกต่างกันบ้าง
ความแตกต่างที่สำคัญที่สุดในค่าเริ่มต้นคือไลบรารีใดที่พวกเขาเชื่อมโยงโดยอัตโนมัติ
ตาม GCC ออนไลน์เอกสารตัวเลือกการเชื่อมโยงและวิธีการที่ก. ++ จะเรียก , g++เทียบเท่ากับgcc -xc++ -lstdc++ -shared-libgcc(1 เป็นตัวเลือกที่คอมไพเลอร์ที่ 2 ทั้งสองเป็นตัวเลือกลิงเกอร์) สิ่งนี้สามารถตรวจสอบได้ด้วยการรันทั้งสองด้วย-vตัวเลือก (มันแสดงคำสั่งแบ็คเอนด์ Toolchain ที่กำลังทำงาน)
argv[0]เพื่อดูว่าควรใช้การขอร้องใด นี่เป็นเรื่องปกติในหมู่ยูทิลิตี UNIX หลัก
GCC: GNU Compiler Collection
gcc: คอมไพเลอร์
g++GNU C: คอมไพเลอร์GNU C ++
ความแตกต่างหลัก:
gccจะรวบรวม: *.c\*.cppไฟล์เป็น C และ C ++ ตามลำดับg++จะคอมไพล์: *.c\*.cppไฟล์ แต่ทั้งหมดจะถูกใช้เป็นไฟล์ C ++g++เพื่อเชื่อมโยงไฟล์วัตถุมันจะลิงก์โดยอัตโนมัติในไลบรารี std C ++ ( gccไม่ได้ทำสิ่งนี้)gcc การคอมไพล์ไฟล์ C มีมาโครที่กำหนดไว้ล่วงหน้าน้อยลง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
gccโดยผ่าน-lstdc++พารามิเตอร์
gcc -lstdc++ g++เราใส่พฤติกรรมเฉพาะภาษานั้นไว้ในไดรเวอร์ของตัวเองด้วยเหตุผลนั่นคือสิ่งที่มันทำไว้ :-)
-lstdc++เนื่องจากจะไม่มีการพึ่งพาข้อมูลทางคณิตศาสตร์ RTTI และข้อยกเว้น การเชื่อมโยงกรณีทดสอบที่ระบุหรือล้มเหลวจะขึ้นอยู่กับระบบปฏิบัติการและคุณลักษณะของ C ++ ที่ใช้โดยกรณีทดสอบซึ่งอีกครั้งคือสาเหตุที่ความรู้ทั้งหมดนั้นถูกสร้างขึ้นในไดรเวอร์ g ++ แทนที่จะเป็นผู้ใช้ที่เหลือ .
gcc -lstdc++ในระบบปฏิบัติการอื่น ๆ โดยเฉพาะอย่างยิ่งเมื่อเป้าหมายนั้นเป็นแพลตฟอร์มแบบฝัง โชคดีที่นั่นเป็นเหตุผลที่เราจัดส่ง g ++ ในตอนแรก
-dumpspec(ตัวอย่าง) cross compiler ที่กำหนดเป้าหมายระบบฝังตัวคุณจะเห็นความแตกต่าง มีมากกว่าเพียงความแตกต่าง linker ... ซึ่งอีกครั้งเป็นสิ่งที่คำตอบของคุณเป็นเรื่องเกี่ยวกับ (มาโครโปรเซสเซอร์ก่อนรวมเส้นทาง, ห้องสมุดหลายรันไทม์) ดูเหมือนว่าเราจะพูดคุยกัน แต่ในฐานะผู้ดูแล GCC ในอดีตฉันรับรองว่าฉันคุ้นเคยกับสิ่งที่เป็นส่วนหน้าและไม่ใช่
สำหรับ c ++ คุณควรใช้ g ++
มันเป็นคอมไพเลอร์เดียวกัน (เช่นคอลเลกชันคอมไพเลอร์ GNU) GCC หรือ G ++ เพียงเลือก front-end ที่แตกต่างกันพร้อมตัวเลือกเริ่มต้นที่แตกต่างกัน
สั้น: ถ้าคุณใช้ g ++ ส่วนหน้าจะบอก linker ว่าคุณอาจต้องการที่จะเชื่อมโยงกับห้องสมุดมาตรฐาน C ++ ส่วนต่อท้าย gcc จะไม่ทำเช่นนั้น (และสามารถเชื่อมโยงกับพวกมันได้หากคุณผ่านตัวเลือกบรรทัดคำสั่งที่ถูกต้อง)
ความแตกต่างระหว่าง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 ++ คุณควรเรียกใช้ GCCg++แทน
ข้อแตกต่างที่น่าสังเกตคือถ้าคุณส่ง.cไฟล์ไปยัง gcc มันจะคอมไพล์เป็น C
พฤติกรรมเริ่มต้นของ g ++ คือการปฏิบัติต่อ.cไฟล์เป็น C ++ (เว้นแต่-x cจะระบุไว้)
แม้ว่าคำสั่ง gcc และ g ++ จะทำสิ่งที่คล้ายกันมาก แต่ g ++ ได้รับการออกแบบให้เป็นคำสั่งที่คุณเรียกใช้เพื่อคอมไพล์โปรแกรม C ++; มีวัตถุประสงค์เพื่อทำสิ่งที่ถูกต้องโดยอัตโนมัติ
เบื้องหลังโปรแกรมนี้เป็นโปรแกรมเดียวกันจริง ๆ ตามที่ฉันเข้าใจทั้งคู่ตัดสินใจว่าจะคอมไพล์โปรแกรมเป็น C หรือเป็น C ++ ตามนามสกุลไฟล์ ทั้งสองมีความสามารถในการเชื่อมโยงกับไลบรารีมาตรฐาน C ++ แต่เฉพาะ g ++ ทำตามค่าเริ่มต้น ดังนั้นหากคุณมีโปรแกรมที่เขียนใน C ++ ซึ่งไม่จำเป็นต้องเชื่อมโยงกับไลบรารีมาตรฐาน gcc จะเกิดขึ้นเพื่อทำสิ่งที่ถูกต้อง แต่จากนั้น g ++ จะเป็นเช่นนั้น ดังนั้นจึงไม่มีเหตุผลที่จะไม่ใช้ g ++ สำหรับการพัฒนา C ++ ทั่วไป
ฉันสนใจเรื่องนี้และทำการทดลองบางอย่าง
ฉันพบคำอธิบายที่นี่แต่สั้นมาก
จากนั้นฉันพยายามทดสอบด้วย 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ฉันพยายามรวบรวมไฟล์ทดสอบอย่างง่าย 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แต่เมื่อฉันพยายามเรียกใช้เครื่องมือ "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]แต่อันนี้ก็ยังทำงานได้โดยไม่มีข้อผิดพลาด
$ gcc -x c++ -std=c++98 test_cpp.cและนี่ก็เช่นกัน
$ 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;
}
ผลการวิจัย:
หากดูที่แผนผังกระบวนการดูเหมือนว่า gcc และ g ++ เป็นแบ็กเอนด์ไปยังเครื่องมืออื่น ๆ ซึ่งในสภาพแวดล้อมของฉันคือ: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc ทำงานได้ดีเป็น metatool หากคุณมีส่วนขยายที่ถูกต้องหรือตั้งค่าสถานะที่ถูกต้อง ดูนี่สิ
“ GCC” เป็นคำศัพท์ย่อทั่วไปสำหรับ GNU Compiler Collection นี่คือทั้งชื่อสามัญที่สุดสำหรับคอมไพเลอร์และชื่อที่ใช้เมื่อมีการเน้นในการรวบรวมโปรแกรม C (เมื่อก่อนหน้านี้ย่อมาจาก "GNU C Compiler")
เมื่ออ้างถึงการคอมไพล์ C ++ เป็นเรื่องปกติที่จะเรียกคอมไพเลอร์“ G ++” เนื่องจากมีคอมไพเลอร์เพียงตัวเดียวจึงถูกต้องที่จะเรียกมันว่า "GCC" ไม่ว่าบริบทของภาษาจะเป็นอย่างไร อย่างไรก็ตามคำว่า“ G ++” มีประโยชน์มากกว่าเมื่อเน้นการคอมไพล์โปรแกรม C ++
ฉันกำลังทดสอบ 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 ++ เป็นตัวเลือกที่ดีกว่า
gcc และ g ++ เป็นคอมไพเลอร์ GNU พวกเขาทั้งสองรวบรวม c และ c ++ ข้อแตกต่างสำหรับไฟล์ * .c gcc ถือเป็นโปรแกรม ac และ g ++ เห็นว่าเป็นโปรแกรม ac ++ ไฟล์ * .cpp ถือเป็นโปรแกรม c ++ c ++ เป็นชุดสุดของ c และไวยากรณ์มีความเข้มงวดมากขึ้นดังนั้นควรระมัดระวังเกี่ยวกับคำต่อท้าย
g++จะแปล.ccเป็น C ++ - เฉพาะส่วนขยายชื่อไฟล์