سؤال
ما الفرق بين g++ و gcc؟ما هي العناصر التي يجب استخدامها لتطوير لغة C++ العامة؟
المحلول
وgcc
وg++
هي مترجم السائقين من GNU مترجم <م> أغانى م> (الذي كان في وقت من الأوقات مجرد GNU <م> C مترجم م>).
وعلى الرغم من أنها تحدد تلقائيا التي الخلفيات (cc1
cc1plus
...) لاستدعاء اعتمادا على نوع الملف، إلا إذا تجاوز مع -x language
، لديهم بعض الاختلافات.
والفرق وربما الأكثر أهمية في إعداداتها الافتراضية هو الذي المكتبات أنها ترتبط ضد تلقائيا.
ووفقا للوثائق على الانترنت خيارات الارتباط و <لأ href = "https://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html" يختلط = "noreferrer"> كيف ز ++ يتم استدعاء ، g++
ما يعادل gcc -xc++ -lstdc++ -shared-libgcc
(في 1 هو خيار مترجم، و 2ND هما خيارات رابط). يمكن التحقق من ذلك عن طريق تشغيل مع كل من الخيار -v
(فإنه يعرض على المدى الأوامر الخلفية toolchain الراهن).
نصائح أخرى
مجلس التعاون الخليجي:مجموعة مترجم جنو
- تشير إلى جميع اللغات المختلفة التي يدعمها مترجم جنو.
مجلس التعاون الخليجي:مترجم GNU C
ز++:مترجم جنو C++
الاختلافات الرئيسية:
- سوف يقوم مجلس التعاون الخليجي بتجميع:ملفات *.c/*.cpp بتنسيق C وC++ على التوالي.
- سوف يقوم g++ بتجميع:ملفات *.c/*.cpp ولكن سيتم التعامل معها جميعًا كملفات C++.
- وأيضًا إذا كنت تستخدم g++ لربط ملفات الكائنات، فسيتم ربطها تلقائيًا في مكتبات std C++ (لا تقوم 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
لج ++ يجب عليك استخدام ز ++.
وانها نفس مترجم (مثل جمع مترجم GNU). دول مجلس التعاون الخليجي أو G ++ مجرد اختيار مختلفة الأمامية مع خيارات افتراضية مختلفة.
في وباختصار يمكن القول: إذا كنت تستخدم ز ++ الواجهة الأمامية سوف اقول رابط التي قد تحتاج إلى ربط مع المكتبات القياسية C ++. فإن الواجهة دول مجلس التعاون الخليجي لا تفعل ذلك (أيضا يمكن أن تصل معهم إذا كنت تمر الصحيحة خيارات سطر الأوامر).
ماهو الفرق بين g++
و gcc
?
gcc
تطورت من لغة واحدة "مترجم GNU C" لتصبح "مجموعة مترجم GNU" متعددة اللغات.لا يزال مصطلح "مترجم GNU C" يستخدم أحيانًا في سياق برمجة C.
ال g++
يكون مترجم C++ لمجموعة مترجمات GNU.يحب gnat
هو مترجم Ada ل gcc
. راجع استخدام مجموعة مترجمات GNU (GCC)
على سبيل المثال، أوبونتو 16.04 و18.04 man g++
يقوم الأمر بإرجاع GCC(1)
صفحة يدوية.
أوبونتو 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
, ، أوmachine-gcc
عند التجميع المتقاطع، أوmachine-gcc-version
لتشغيل نسخة محددة من دول مجلس التعاون الخليجي. عند تجميع برامج C++، يجب عليك استدعاء مجلس التعاون الخليجي باسمg++
بدلاً من.
والفرق الوحيد الملحوظ هو أنه إذا قمت بتمرير .c
لدول مجلس التعاون الخليجي سيكون تجميع كما C، في حين ز ++ سوف نتعامل دائما بأنها C ++.
وعلى الرغم من أن دول مجلس التعاون الخليجي وز ++ الأوامر تفعل أشياء متشابهة جدا، ز ++ تم تصميمه ليكون الأمر كنت استدعاء ترجمة برنامج C ++؛ والمقصود أن تفعل تلقائيا الشيء الصحيح.
وراء الكواليس، وانهم في الحقيقة نفس البرنامج. كما أفهم، سواء تقرر ما إذا كانت ترجمة برنامج كما C أو C ++ استنادا إلى ملحق اسم الملف. كلاهما قادر على ربط ضد مكتبة القياسية C ++، ولكن فقط ز ++ يفعل ذلك بشكل افتراضي. حتى إذا كان لديك برنامج مكتوب في C ++ هذا لا يحدث في حاجة لربط ضد مكتبة القياسية، ودول مجلس التعاون الخليجي يحدث لفعل الشيء الصحيح. ولكن بعد ذلك، حتى لو ز ++. لذلك هناك حقا أي سبب لعدم استخدام ز ++ 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
ملاحظة.ملفات الاختبار
$ 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 إذا كان لديك تمديد صحيح أو تعيين أعلام -S -STD الصحيح.يرى هذا
"GCC" هو مصطلح مختصر شائع لمجموعة مترجمات GNU.هذا هو الاسم الأكثر عمومية للمترجم، والاسم المستخدم عندما يكون التركيز على ترجمة برامج C (كما كان الاختصار سابقًا يعني "GNU C Compiler").
عند الإشارة إلى تجميع C++، من المعتاد استدعاء المترجم "G++".نظرًا لوجود مترجم واحد فقط، فمن الصحيح أيضًا تسميته "GCC" بغض النظر عن سياق اللغة؛ومع ذلك، فإن المصطلح "G++" يكون أكثر فائدة عندما يكون التركيز على تجميع برامج C++.
يمكنك قراءة المزيد هنا.
كنت أختبر دول مجلس التعاون الخليجي وg++ في نظام لينكس.باستخدام 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)'
لذا فإن استنتاجي الخاص هو أن دول مجلس التعاون الخليجي لا تدعم بشكل كامل "C plus plus". يبدو أن اختيار g++ لملفات مصدر C++ يعد خيارًا أفضل.
ودول مجلس التعاون الخليجي وز ++ كلاهما مترجم GNU. كلاهما تجميع C و C ++. والفرق هو ل* .C ملفات يعامل دول مجلس التعاون الخليجي على أنها برنامج ج، ز ++ تعتبره برنامج ج ++. تعتبر * ملفات .CPP أن تكون ج ++ البرامج. ج ++ هو مجموعة سوبر ج وبناء الجملة هي أكثر صرامة، لذا كن حذرا حول لاحقة.