ความแตกต่างระหว่าง 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
หน้าคนสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกที่แปรปรวนระหว่างและ gcc
g++
ควรใช้อันไหนสำหรับการพัฒนา 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 ++ - เฉพาะส่วนขยายชื่อไฟล์