हम अलग-अलग समय पर gcc और g++ कंपाइलर्स का उपयोग करते हैं। यहां हम देखेंगे कि gcc और g++ में क्या अंतर हैं।
gcc GNU C कंपाइलर है, और g++ GNU C++ कंपाइलर है। मुख्य अंतर इस प्रकार हैं:
- gcc *.c या *.cpp फ़ाइलों को क्रमशः C और C++ के रूप में कंपाइल कर सकता है
- g++ *.c और *.cpp दोनों फ़ाइलों को कंपाइल कर सकता है, लेकिन दोनों को C++ फ़ाइल के रूप में लेता है
- यदि हम ऑब्जेक्ट फ़ाइलों को लिंक करने के लिए g++ का उपयोग करना चाहते हैं, तो यह ऑटोमैटिकली स्टैंडर्ड C++ लाइब्रेरीज में लिंक कर देता है। gcc ऐसा नहीं करता
- gcc C फ़ाइलों को कम प्रीडिफाइंड मैक्रोज़ के साथ कंपाइल करता है
- gcc C++ फ़ाइलों को अधिक संख्या में प्रीडिफाइंड मैक्रोज़ के साथ कंपाइल करता है, और g++ भी अधिक प्रीडिफाइंड मैक्रोज़ के साथ कंपाइल करता है
C++ फ़ाइलों के लिए अतिरिक्त मैक्रोज़
#define __GXX_WEAK__ 1 #define __cplusplus 1 #define __DEPRECATED 1 #define __GNUG__ 4 #define __EXCEPTIONS 1 #define __private_extern__ extern
व्यावहारिक अंतर
| परिदृश्य | gcc file.cpp | g++ file.cpp |
|---|---|---|
| कंपाइलर फ्रंटएंड | C++ (फाइल एक्सटेंशन से पता लगाता है) | C++ (डिफ़ॉल्ट) |
| स्टैंडर्ड लाइब्रेरी लिंकिंग | नहीं (मैनुअल -lstdc++ आवश्यक) | हां (ऑटोमैटिक) |
| प्रीडिफाइंड मैक्रोज़ | C++ मैक्रोज़ शामिल | C++ मैक्रोज़ शामिल |
| .c फ़ाइल कंपाइल | C मोड में | C++ मोड में (चेतावनी/त्रुटि संभव) |
उदाहरण: gcc से C++ लिंक करना
# C++ कोड के साथ gcc का उपयोग - लिंकर त्रुटि देगा $ gcc test.cpp /tmp/ccxxxx.o: undefined reference to `std::cout' # समाधान: मैनुअल लिंकिंग $ gcc test.cpp -lstdc++ # या बस g++ का उपयोग करें $ g++ test.cpp
कब क्या उपयोग करें
- gcc: शुद्ध C प्रोजेक्ट्स के लिए, या जब मैनुअल लिंकिंग नियंत्रण चाहिए।
- g++: C++ प्रोजेक्ट्स के लिए (डिफ़ॉल्ट विकल्प)। ऑटोमैटिकली libstdc++ लिंक करता है।
- क्रॉस-कंपाइलिंग: आर्किटेक्चर-विशिष्ट प्रीफिक्स का उपयोग करें (जैसे
arm-linux-gnueabihf-g++)।
सामान्य फ्लैग्स
# चेतावनियां सक्षम करें g++ -Wall -Wextra -pedantic # ऑप्टिमाइज़ेशन g++ -O2 -march=native # डिबग सिंबल्स g++ -g # C++ मानक निर्दिष्ट करें g++ -std=c++17 g++ -std=c++20 # ऑब्जेक्ट फ़ाइल बनाएं (लिंक न करें) g++ -c source.cpp -o source.o
नोट: gcc और g++ एक ही कंपाइलर इंफ्रास्ट्रक्चर (GCC) के अलग-अलग फ्रंटएंड्स/ड्राइवर्स हैं। बैकएंड (ऑप्टिमाइज़र, कोड जनरेटर) साझा है।