C++
संकलन और भवन
खोज…
परिचय
C ++ में लिखे गए प्रोग्राम को चलाने से पहले संकलित करने की आवश्यकता है। आपके ऑपरेटिंग सिस्टम के आधार पर बड़ी संख्या में कंपाइलर उपलब्ध हैं।
टिप्पणियों
अधिकांश ऑपरेटिंग सिस्टम एक संकलक के बिना जहाज करते हैं, और उन्हें बाद में स्थापित करना होगा। कुछ सामान्य संकलक विकल्प हैं:
- जीसीसी, जीएनयू कंपाइलर संग्रह जी ++
- क्लैंग: एलवीएमएम क्लैंग ++ के लिए एक सी भाषा परिवार का दृश्य
- MSVC, Microsoft Visual C ++ (Visual Studio में शामिल) visual-c ++
- C ++ बिल्डर, Embarcadero C ++ बिल्डर (रेड स्टूडियो में शामिल) c ++ बिल्डर
C ++ प्रोग्राम को संकलित करने के तरीके पर कृपया उचित कंपाइलर मैनुअल से परामर्श करें।
अपने स्वयं के विशिष्ट बिल्ड सिस्टम के साथ एक विशिष्ट संकलक का उपयोग करने का दूसरा विकल्प, सामान्य बिल्ड सिस्टम को एक विशिष्ट संकलक के लिए या डिफ़ॉल्ट रूप से स्थापित एक के लिए परियोजना को कॉन्फ़िगर करने देना संभव है।
जीसीसी के साथ संकलन
main.cpp
नामक एक एकल स्रोत फ़ाइल को मानते हुए, एक गैर-अनुकूलित निष्पादन योग्य को संकलित करने और लिंक करने के लिए आदेश निम्नानुसार है (अनुकूलन के बिना संकलन प्रारंभिक विकास और डिबगिंग के लिए उपयोगी है, हालांकि -Og
आधिकारिक तौर पर नए जीसीसी संस्करणों के लिए अनुशंसित है)।
g++ -o app -Wall main.cpp -O0
उत्पादन में इस्तेमाल के लिए एक अनुकूलित निष्पादन योग्य बनाने के लिए, में से एक का उपयोग करें -O
विकल्प (देखें: -O1
, -O2
, -O3
, -Os
, -Ofast
):
g++ -o app -Wall -O2 main.cpp
यदि -O विकल्प को छोड़ दिया जाता है, तो -O0, जिसका कोई अनुकूलन नहीं है, का उपयोग डिफ़ॉल्ट के रूप में किया जाता है (-O1 को संख्या के बिना निर्दिष्ट करता है -O निर्दिष्ट करता है)।
वैकल्पिक रूप से, O
समूहों (या अधिक प्रायोगिक अनुकूलन) से सीधे अनुकूलन झंडे का उपयोग करें। निम्न उदाहरण -O2
ऑप्टिमाइज़ेशन के साथ -O3
ऑप्टिमाइज़ेशन स्तर से एक ध्वज बनाता है:
g++ -o app -Wall -O2 -ftree-partial-pre main.cpp
एक प्लेटफ़ॉर्म-विशिष्ट अनुकूलित निष्पादन योग्य बनाने के लिए (उसी आर्किटेक्चर के साथ मशीन पर उत्पादन में उपयोग के लिए), उपयोग करें:
g++ -o app -Wall -O2 -march=native main.cpp
या तो ऊपर के साथ चलाया जा सकता है एक बाइनरी फ़ाइल का उत्पादन करेगा .\app.exe
Windows और पर ./app
लिनक्स पर, मैक ओएस, आदि
-o
ध्वज को भी छोड़ा जा सकता है। इस मामले में, जीसीसी डिफ़ॉल्ट उत्पादन निष्पादन योग्य बनाएगा a.exe
विंडोज पर और a.out
सिस्टम की तरह यूनिक्स पर। किसी फ़ाइल को लिंक किए बिना संकलित करने के लिए, -c
विकल्प का उपयोग करें:
g++ -o file.o -Wall -c file.cpp
यह file.o
नामक एक ऑब्जेक्ट फ़ाइल का उत्पादन करता है जिसे बाद में एक बाइनरी बनाने के लिए अन्य फ़ाइलों के साथ जोड़ा जा सकता है:
g++ -o app file.o otherfile.o
अनुकूलन विकल्पों के बारे में अधिक जानकारी gcc.gnu.org पर देखी जा सकती है। विशेष नोट के -Og
(डिबगिंग अनुभव पर जोर देने के साथ अनुकूलन - मानक संपादन-संकलन-डिबग चक्र के लिए अनुशंसित) और -Ofast
(सभी ऑप्टिमाइज़ेशन, सख्त मानकों के अनुपालन की उपेक्षा करने वाले सहित)।
-Wall
ध्वज कई सामान्य त्रुटियों के लिए चेतावनी को सक्षम करता है और हमेशा उपयोग किया जाना चाहिए। कोड की गुणवत्ता में सुधार करने के लिए इसे अक्सर उपयोग करने के लिए प्रोत्साहित किया जाता है -Wextra
और अन्य चेतावनी झंडे जो स्वचालित रूप से -Wall
और -Wextra
द्वारा सक्षम नहीं हैं।
यदि कोड एक विशिष्ट C ++ मानक की अपेक्षा करता है, तो -std=
ध्वज को शामिल करके कौन से मानक का उपयोग करें। समर्थित मान ISO C ++ मानक के प्रत्येक संस्करण के लिए अंतिम वर्ष के अनुरूप हैं। GCC 6.1.0 के अनुसार, std=
ध्वज के वैध मान c++98
/ c++03
, c++11
, c++14
और c++17
/ c++1z
। आगे स्लैश द्वारा अलग किए गए मूल्य बराबर हैं।
g++ -std=c++11 <file>
GCC में कुछ कंपाइलर-विशिष्ट एक्सटेंशन शामिल होते हैं, जो तब अक्षम होते हैं जब वे -std=
ध्वज द्वारा निर्दिष्ट मानक के साथ टकराव करते हैं। सक्षम किए गए सभी एक्सटेंशन को संकलित करने के लिए, मूल्य gnu++XX
का उपयोग किया जा सकता है, जहां XX
ऊपर दिए गए c++
सूची द्वारा उपयोग किए गए वर्षों में से कोई भी है।
यदि कोई भी निर्दिष्ट नहीं है, तो डिफ़ॉल्ट मानक का उपयोग किया जाएगा। 6.1.0 से पहले GCC के संस्करणों के लिए, डिफ़ॉल्ट है -std=gnu++03
; GCC में 6.1.0 और अधिक से अधिक, डिफ़ॉल्ट है -std=gnu++14
।
ध्यान दें कि GCC में बग्स के कारण, -pthread
ध्वज को C ++ 11 के साथ शुरू की गई C ++ मानक सूत्रण कार्यक्षमता का समर्थन करने के लिए संकलन और GCC से जोड़ने के लिए मौजूद होना चाहिए, जैसे कि std::thread
और std::wait_for
। थ्रेडिंग फ़ंक्शंस का उपयोग करते समय इसे स्वीकार करने पर कोई चेतावनी नहीं बल्कि कुछ प्लेटफार्मों पर अमान्य परिणाम हो सकते हैं।
पुस्तकालयों के साथ जोड़ना:
लाइब्रेरी नाम पास करने के लिए -l
विकल्प का उपयोग करें:
g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)
यदि लाइब्रेरी मानक लाइब्रेरी पथ में नहीं है, तो -L
विकल्प के साथ पथ जोड़ें:
g++ main.cpp -L/my/custom/path/ -lmylib
एकाधिक पुस्तकालयों को एक साथ जोड़ा जा सकता है:
g++ main.cpp -lmylib1 -lmylib2 -lmylib3
यदि एक पुस्तकालय दूसरे पर निर्भर करता है, तो स्वतंत्र पुस्तकालय से पहले आश्रित पुस्तकालय डालें:
g++ main.cpp -lchild-lib -lbase-lib
या लिंकर को --start-group
और --end-group
माध्यम से आदेश देने का निर्धारण करने दें (ध्यान दें: इसमें महत्वपूर्ण प्रदर्शन लागत है):
g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group
विजुअल C ++ (कमांड लाइन) के साथ संकलन
जीसीसी या क्लैंग से विजुअल स्टूडियो में आने वाले प्रोग्रामर के लिए, या प्रोग्रामर सामान्य रूप से कमांड लाइन के साथ अधिक आरामदायक होते हैं, आप कमांड लाइन से आईडीई के साथ-साथ विजुअल C ++ कंपाइलर का उपयोग कर सकते हैं।
यदि आप विज़ुअल स्टूडियो में कमांड लाइन से अपना कोड संकलित करना चाहते हैं, तो आपको सबसे पहले कमांड लाइन वातावरण सेट करना होगा। इसे या तो Visual Studio Command Prompt
/ Developer Command Prompt
/ x86 Native Tools Command Prompt
/ x64 Native Tools Command Prompt
या समान (जैसे कि Visual Studio के आपके संस्करण द्वारा प्रदान किया गया है), या कमांड प्रॉम्प्ट पर नेविगेट करके खोला जा सकता है। कंपाइलर की इंस्टॉलेशन डायरेक्टरी (आमतौर पर \Program Files (x86)\Microsoft Visual Studio x\VC
की VC
उपनिर्देशिका, जहाँ x
संस्करण संख्या है (जैसे कि 2010 के लिए 10.0
, या 2015 के लिए 14.0
) और VCVARSALL
बैच फ़ाइल को चलाने के साथ। यहाँ निर्दिष्ट कमांड-लाइन पैरामीटर।
ध्यान दें कि GCC के विपरीत, Visual Studio संकलक ( cl.exe
) के माध्यम से लिंकर ( link.exe
) के लिए फ्रंट-एंड प्रदान नहीं करता है, लेकिन इसके बजाय लिंकर को एक अलग प्रोग्राम के रूप में प्रदान करता है, जिसे कंपाइलर बाहर निकलते ही कॉल करता है। cl.exe
और link.exe
अलग-अलग फ़ाइलों और विकल्पों के साथ अलग-अलग उपयोग किए जा सकते हैं, या दोनों कार्यों को एक साथ किए जाने पर link
करने के लिए फ़ाइलों और विकल्पों को पास करने के लिए cl
को कहा जा सकता है। किसी भी जोड़ने के विकल्प के लिए निर्दिष्ट cl
के लिए विकल्पों में अनुवाद किया जाएगा link
, और द्वारा संसाधित नहीं किसी भी फाइल cl
सीधे को दे दिया जाएगा link
। जैसा कि यह मुख्य रूप से विज़ुअल स्टूडियो कमांड लाइन के साथ संकलन करने के लिए एक सरल मार्गदर्शिका है, इस समय link
लिए तर्कों का वर्णन नहीं किया जाएगा; यदि आपको सूची की आवश्यकता है, तो यहां देखें।
ध्यान दें कि cl
तर्क केस-संवेदी है, जबकि link
करने के लिए तर्क नहीं है।
[सलाह दी जाती है कि निरपेक्ष पथ नामों को निर्दिष्ट करते समय निम्न उदाहरणों में से कुछ उदाहरण विंडोज शेल "वर्तमान निर्देशिका" चर, %cd%
करते हैं। इस चर से अपरिचित किसी के लिए, यह वर्तमान कार्यशील निर्देशिका में फैलता है। कमांड लाइन से, यह वह निर्देशिका होगी जब आप cl
चलाते थे, और डिफ़ॉल्ट रूप से कमांड प्रॉम्प्ट में निर्दिष्ट किया जाता है (यदि आपका कमांड प्रॉम्प्ट C:\src>
, उदाहरण के लिए, तो %cd%
C:\src\
)]
वर्तमान फ़ोल्डर में main.cpp
नाम के एक एकल स्रोत फ़ाइल को मानते हुए, एक अनपॉइंटिमाइज्ड एग्जीक्यूटेबल (आरंभिक विकास और डीबगिंग के लिए उपयोगी) को संकलित और लिंक करने के लिए कमांड है (निम्न में से किसी एक का उपयोग करें):
cl main.cpp
// Generates object file "main.obj".
// Performs linking with "main.obj".
// Generates executable "main.exe".
cl /Od main.cpp
// Same as above.
// "/Od" is the "Optimisation: disabled" option, and is the default when no /O is specified.
एक ही निर्देशिका में एक अतिरिक्त स्रोत फ़ाइल "niam.cpp" को मानते हुए, निम्नलिखित का उपयोग करें:
cl main.cpp niam.cpp
// Generates object files "main.obj" and "niam.obj".
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".
आप वाइल्डकार्ड का भी उपयोग कर सकते हैं, जैसा कि कोई अपेक्षा करता है:
cl main.cpp src\*.cpp
// Generates object file "main.obj", plus one object file for each ".cpp" file in folder
// "%cd%\src".
// Performs linking with "main.obj", and every additional object file generated.
// All object files will be in the current folder.
// Generates executable "main.exe".
निष्पादन योग्य का नाम बदलने या स्थानांतरित करने के लिए, निम्नलिखित में से किसी एक का उपयोग करें:
cl /o name main.cpp
// Generates executable named "name.exe".
cl /o folder\ main.cpp
// Generates executable named "main.exe", in folder "%cd%\folder".
cl /o folder\name main.cpp
// Generates executable named "name.exe", in folder "%cd%\folder".
cl /Fename main.cpp
// Same as "/o name".
cl /Fefolder\ main.cpp
// Same as "/o folder\".
cl /Fefolder\name main.cpp
// Same as "/o folder\name".
दोनों /o
और /Fe
अपने पैरामीटर (चलो इसे o-param
) को /OUT:o-param
रूप में link
करने के लिए, उपयुक्त एक्सटेंशन (आम तौर पर .exe
या .dll
) को "नाम" o-param
s के रूप में आवश्यक रूप से जोड़ते हैं। जबकि दोनों /o
और /Fe
कार्यक्षमता में मेरे ज्ञान के समान हैं, बाद वाले को विजुअल स्टूडियो के लिए पसंद किया जाता है। /o
को पदावनत के रूप में चिह्नित किया गया है, और मुख्य रूप से प्रोग्रामर के लिए प्रदान किया जाता है जो GCC या Clang से अधिक परिचित हैं।
ध्यान दें कि /o
और /o
और निर्दिष्ट फ़ोल्डर और / या नाम के बीच का स्थान वैकल्पिक है, लेकिन /Fe
और निर्दिष्ट फ़ोल्डर और / या नाम के बीच कोई स्थान नहीं हो सकता है।
इसी तरह, एक अनुकूलित निष्पादन योग्य (उत्पादन में उपयोग के लिए) का उपयोग करने के लिए, उपयोग करें:
cl /O1 main.cpp
// Optimise for executable size. Produces small programs, at the possible expense of slower
// execution.
cl /O2 main.cpp
// Optimise for execution speed. Produces fast programs, at the possible expense of larger
// file size.
cl /GL main.cpp other.cpp
// Generates special object files used for whole-program optimisation, which allows CL to
// take every module (translation unit) into consideration during optimisation.
// Passes the option "/LTCG" (Link-Time Code Generation) to LINK, telling it to call CL during
// the linking phase to perform additional optimisations. If linking is not performed at this
// time, the generated object files should be linked with "/LTCG".
// Can be used with other CL optimisation options.
अंत में, प्लेटफ़ॉर्म-विशिष्ट अनुकूलित निष्पादन योग्य (निर्दिष्ट आर्किटेक्चर के साथ मशीन पर उत्पादन में उपयोग के लिए) का उत्पादन करने के लिए, लक्ष्य प्लेटफ़ॉर्म के लिए उपयुक्त कमांड प्रॉम्प्ट या VCVARSALL
पैरामीटर चुनें । link
को ऑब्जेक्ट फ़ाइलों से वांछित प्लेटफ़ॉर्म का पता लगाना चाहिए; यदि नहीं, तो लक्ष्य मंच को स्पष्ट रूप से निर्दिष्ट करने के लिए /MACHINE
विकल्प का उपयोग करें।
// If compiling for x64, and LINK doesn't automatically detect target platform:
cl main.cpp /link /machine:X64
उपरोक्त में से कोई भी /o
या /Fe
द्वारा निर्दिष्ट नाम के साथ एक निष्पादन योग्य उत्पादन करेगा, या यदि नहीं प्रदान किया गया है, तो कंपाइलर को निर्दिष्ट पहले स्रोत या ऑब्जेक्ट फ़ाइल के समान नाम के साथ।
cl a.cpp b.cpp c.cpp
// Generates "a.exe".
cl d.obj a.cpp q.cpp
// Generates "d.exe".
cl y.lib n.cpp o.obj
// Generates "n.exe".
cl /o yo zp.obj pz.cpp
// Generates "yo.exe".
लिंक के बिना एक फ़ाइल संकलित करने के लिए, उपयोग करें:
cl /c main.cpp
// Generates object file "main.obj".
यह कॉलिंग link
बिना बाहर निकलने के लिए cl
को बताता है, और एक ऑब्जेक्ट फ़ाइल का उत्पादन करता है, जिसे बाद में एक बाइनरी का उत्पादन करने के लिए अन्य फ़ाइलों के साथ जोड़ा जा सकता है।
cl main.obj niam.cpp
// Generates object file "niam.obj".
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".
link main.obj niam.obj
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".
अन्य मूल्यवान कमांड लाइन पैरामीटर भी हैं, जिन्हें जानना उपयोगकर्ताओं के लिए बहुत उपयोगी होगा:
cl /EHsc main.cpp
// "/EHsc" specifies that only standard C++ ("synchronous") exceptions will be caught,
// and `extern "C"` functions will not throw exceptions.
// This is recommended when writing portable, platform-independent code.
cl /clr main.cpp
// "/clr" specifies that the code should be compiled to use the common language runtime,
// the .NET Framework's virtual machine.
// Enables the use of Microsoft's C++/CLI language in addition to standard ("native") C++,
// and creates an executable that requires .NET to run.
cl /Za main.cpp
// "/Za" specifies that Microsoft extensions should be disabled, and code should be
// compiled strictly according to ISO C++ specifications.
// This is recommended for guaranteeing portability.
cl /Zi main.cpp
// "/Zi" generates a program database (PDB) file for use when debugging a program, without
// affecting optimisation specifications, and passes the option "/DEBUG" to LINK.
cl /LD dll.cpp
// "/LD" tells CL to configure LINK to generate a DLL instead of an executable.
// LINK will output a DLL, in addition to an LIB and EXP file for use when linking.
// To use the DLL in other programs, pass its associated LIB to CL or LINK when compiling those
// programs.
cl main.cpp /link /LINKER_OPTION
// "/link" passes everything following it directly to LINK, without parsing it in any way.
// Replace "/LINKER_OPTION" with any desired LINK option(s).
किसी के लिए और अधिक परिचित * nix सिस्टम और / या GCC / Clang, cl
, link
, और अन्य Visual Studio कमांड लाइन टूल स्लैश (जैसे /c
) के बजाय एक हाइफ़न (जैसे -c
) के साथ निर्दिष्ट पैरामीटर स्वीकार कर सकते हैं। इसके अतिरिक्त, विंडोज या तो स्लैश या बैकस्लैश को एक मान्य पथ विभाजक के रूप में पहचानता है, इसलिए * निक्स-शैली पथ का भी उपयोग किया जा सकता है। यह साधारण संकलक कमांड लाइनों को g++
या clang++
से cl
, या इसके विपरीत, न्यूनतम परिवर्तनों के साथ परिवर्तित करना आसान बनाता है।
g++ -o app src/main.cpp
cl -o app src/main.cpp
बेशक, जब अधिक जटिल g++
या clang++
विकल्प का उपयोग करने वाली कमांड लाइनों को पोर्ट करते हैं, तो आपको लागू कंपाइलर डॉक्यूमेंटेशन और / या संसाधन साइटों पर समतुल्य कमांड देखने की आवश्यकता होती है, लेकिन इससे चीजों को कम से कम समय बिताने के साथ सीखने में आसानी होती है। नए संकलक।
यदि आपको अपने कोड के लिए विशिष्ट भाषा सुविधाओं की आवश्यकता है, तो MSVC की एक विशिष्ट रिलीज़ आवश्यक थी। दृश्य C ++ 2015 से अपडेट 3 पर /std
ध्वज के माध्यम से संकलन करने के लिए मानक का संस्करण चुनना संभव है। संभावित मान हैं /std:c++14
और /std:c++latest
( /std:c++17
जल्द ही अनुसरण करेंगे)।
नोट: इस संकलक के पुराने संस्करणों में, विशिष्ट सुविधा झंडे उपलब्ध थे, हालांकि यह ज्यादातर नई सुविधाओं के पूर्वावलोकन के लिए उपयोग किया गया था।
विजुअल स्टूडियो (ग्राफिकल इंटरफ़ेस) के साथ संकलन - हैलो वर्ल्ड
- विजुअल स्टूडियो कम्युनिटी 2015 को डाउनलोड और इंस्टॉल करें
- विजुअल स्टूडियो कम्युनिटी खोलें
- फ़ाइल -> नया -> प्रोजेक्ट पर क्लिक करें
- टेम्प्लेट -> विज़ुअल C ++ -> Win32 कंसोल एप्लिकेशन पर क्लिक करें और फिर प्रोजेक्ट MyFirstProgram नाम दें।
- ओके पर क्लिक करें
- अगली विंडो में अगला क्लिक करें।
-
Empty project
बॉक्स की जाँच करें और फिर समाप्त पर क्लिक करें: - फ़ोल्डर स्रोत फ़ाइल पर राइट क्लिक करें -> जोड़ें -> नया आइटम:
- C ++ फ़ाइल का चयन करें और फ़ाइल का नाम main.cpp रखें, फिर Add पर क्लिक करें: 10: नई फ़ाइल main.cpp में निम्न कोड को कॉपी और पेस्ट करें:
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
आपको पर्यावरण जैसा दिखना चाहिए:
- डीबग पर क्लिक करें -> बिना डिबगिंग के प्रारंभ करें (या ctrl + F5 दबाएं):
क्लैंग के साथ संकलन
जैसा कि क्लैंग फ्रंट-एंड को जीसीसी के साथ संगत होने के लिए डिज़ाइन किया गया है, अधिकांश प्रोग्राम जो जीसीसी के माध्यम से संकलित किए जा सकते हैं, जब आप बिल्ड स्क्रिप्ट में clang++
g++
द्वारा स्वैप करते हैं तो संकलन करेंगे। यदि कोई -std=version
नहीं दिया गया है, तो gnu11 का उपयोग किया जाएगा।
MSVC के लिए उपयोग किए जाने वाले Windows उपयोगकर्ता clang-cl.exe
साथ cl.exe
स्वैप कर सकते हैं। डिफ़ॉल्ट रूप से, क्लैंग MSVC के उच्चतम संस्करण के साथ संगत होने की कोशिश करता है जिसे स्थापित किया गया है।
दृश्य स्टूडियो के साथ संकलन के मामले में, क्लैंग-क्ल का उपयोग प्रोजेक्ट गुणों में Platform toolset
को बदलकर किया जा सकता है।
दोनों मामलों में, क्लैंग केवल इसके फ्रंट-एंड के माध्यम से संगत है, हालांकि यह बाइनरी संगत ऑब्जेक्ट फ़ाइलों को उत्पन्न करने की भी कोशिश करता है। क्लैंग-क्ल के उपयोगकर्ताओं को ध्यान देना चाहिए कि MSVC के साथ संगतता अभी तक पूरी नहीं हुई है ।
क्लैंग या क्लैंग-क्ल का उपयोग करने के लिए, कोई निश्चित लिनक्स वितरण पर डिफ़ॉल्ट इंस्टॉलेशन का उपयोग कर सकता है या जो आईडीई (मैक पर एक्सकोड) की तरह बंडल कर सकता है। इस संकलक के अन्य संस्करणों के लिए या जिन प्लेटफार्मों में यह स्थापित नहीं है, उन्हें आधिकारिक डाउनलोड पृष्ठ से डाउनलोड किया जा सकता है।
यदि आप अपने कोड का निर्माण करने के लिए CMake का उपयोग कर रहे हैं, तो आप आमतौर पर CC
और CXX
पर्यावरण चर को सेट करके कंपाइलर को स्विच कर सकते हैं:
mkdir build
cd build
CC=clang CXX=clang++ cmake ..
cmake --build .
ऑनलाइन संकलक
विभिन्न वेबसाइट C ++ कंपाइलर को ऑनलाइन एक्सेस प्रदान करती हैं। ऑनलाइन संकलक की सुविधा सेट साइट से साइट पर काफी भिन्न होती है, लेकिन आमतौर पर वे निम्नलिखित कार्य करने की अनुमति देते हैं:
- अपने कोड को ब्राउज़र में वेब फॉर्म में पेस्ट करें।
- कुछ संकलक विकल्प चुनें और कोड संकलित करें।
- कंपाइलर और / या प्रोग्राम आउटपुट लीजिए।
ऑनलाइन कंपाइलर वेबसाइट का व्यवहार आमतौर पर काफी प्रतिबंधात्मक होता है क्योंकि वे किसी को भी कंपाइलर चलाने और अपने सर्वर साइड पर मनमाने कोड को निष्पादित करने की अनुमति देते हैं, जबकि आमतौर पर दूरस्थ मनमाने कोड निष्पादन को भेद्यता माना जाता है।
ऑनलाइन कम्पाइलर निम्नलिखित उद्देश्यों के लिए उपयोगी हो सकते हैं:
- एक मशीन से एक छोटा कोड स्निपेट चलाएं जिसमें C ++ कंपाइलर (स्मार्टफोन, टैबलेट आदि) का अभाव हो।
- सुनिश्चित करें कि कोड अलग-अलग संकलक के साथ सफलतापूर्वक संकलित करता है और उसी तरह से चलाता है, जैसा कि संकलक के साथ संकलित किया गया था।
- C ++ की मूल बातें जानें या सिखाएं।
- आधुनिक C ++ सुविधाओं को जानें (C ++ 14 और C ++ 17 निकट भविष्य में) जब अप-टू-डेट C ++ कंपाइलर स्थानीय मशीन पर उपलब्ध नहीं है।
- अन्य कंपाइलरों के एक बड़े सेट के साथ तुलना करके अपने कंपाइलर में एक बग को रखें। जांचें कि क्या भविष्य के संस्करणों में एक कंपाइलर बग तय किया गया था, जो आपकी मशीन पर उपलब्ध नहीं हैं।
- ऑनलाइन जज समस्याओं का समाधान करें।
क्या ऑनलाइन संकलक के लिए इस्तेमाल नहीं किया जाना चाहिए:
- C ++ का उपयोग करके पूर्ण-विशेषताओं (यहां तक कि छोटे) अनुप्रयोगों का विकास करें। आमतौर पर ऑनलाइन कंपाइलर्स थर्ड-पार्टी लाइब्रेरी के साथ लिंक करने या बिल्ड आर्टवर्क डाउनलोड करने की अनुमति नहीं देते हैं।
- गहन संगणना करें। गंभीर-साइड कंप्यूटिंग संसाधन सीमित हैं, इसलिए किसी भी उपयोगकर्ता द्वारा प्रदान किए गए कार्यक्रम को निष्पादन के कुछ सेकंड के बाद मार दिया जाएगा। अनुमत निष्पादन का समय आमतौर पर परीक्षण और सीखने के लिए पर्याप्त होता है।
- नेट पर ही कंपाइलर सर्वर या किसी थर्ड पार्टी होस्ट को अटैक करें।
उदाहरण:
अस्वीकरण: प्रलेखन लेखक (एस) नीचे सूचीबद्ध किसी भी संसाधन से संबद्ध नहीं हैं। वेबसाइटों को वर्णानुक्रम में सूचीबद्ध किया गया है।
- http://codepad.org/ कोड शेयरिंग के साथ ऑनलाइन कंपाइलर। स्रोत कोड चेतावनी या त्रुटि के संकलन के बाद संपादन कोड इतनी अच्छी तरह से काम नहीं करता है।
- http://coliru.stacked-crooked.com/ ऑनलाइन कंपाइलर जिसके लिए आप कमांड लाइन निर्दिष्ट करते हैं। उपयोग के लिए GCC और Clang दोनों संकलक प्रदान करता है।
- http://cpp.sh/ - C ++ 14 समर्थन के साथ ऑनलाइन संकलक। आपको संकलक कमांड लाइन को संपादित करने की अनुमति नहीं देता है, लेकिन कुछ विकल्प जीयूआई नियंत्रण के माध्यम से उपलब्ध हैं।
- https://gcc.godbolt.org/ - संकलक संस्करणों, आर्किटेक्चर, और डिस्सेम्फ़ेशन आउटपुट की एक विस्तृत सूची प्रदान करता है। बहुत उपयोगी है जब आपको यह निरीक्षण करने की आवश्यकता होती है कि आपका कोड विभिन्न संकलक द्वारा क्या संकलित करता है। जीसीसी, बजना, MSVC (
CL
), इंटेल संकलक (icc
), ELLCC, और Zapcc, मौजूद हैं इनमें से एक या compilers के अधिक एआरएम के लिए उपलब्ध के साथ, ARMv8 (ARM64 के रूप में), Atmel AVR, MIPS, MIPS64, MSP430, PowerPC , x86, और x64 वास्तुशिल्प। कंपाइलर कमांड लाइन तर्क संपादित किए जा सकते हैं। - https://ideone.com/ - कोड स्निपेट व्यवहार को दर्शाने के लिए नेट पर व्यापक रूप से उपयोग किया जाता है। उपयोग के लिए GCC और Clang दोनों प्रदान करता है, लेकिन आपको कंपाइलर कमांड लाइन को संपादित करने की अनुमति नहीं देता है।
- http://melpon.org/wandbox - कई Clang और GNU / GCC संकलक संस्करणों का समर्थन करता है।
- http://onlinegdb.com/ - एक अत्यंत न्यूनतम आईडीई जिसमें एक संपादक, एक कंपाइलर (जीसीसी), और एक डिबगर (जीडीबी) शामिल है।
- http://rextester.com/ - उपयोग के लिए उपलब्ध बूस्ट लाइब्रेरी के साथ, C और C ++ (दोनों अन्य भाषाओं के लिए संकलक के साथ) के लिए क्लैंग, जीसीसी और विज़ुअल स्टूडियो कंपाइलर प्रदान करता है।
- http://tutorialspoint.com/compile_cpp11_online.php - GCC के साथ पूर्ण विशेषताओं वाला UNIX शेल और एक उपयोगकर्ता के अनुकूल प्रोजेक्ट एक्सप्लोरर।
- http://webcompiler.cloudapp.net/ - ऑनलाइन दृश्य स्टूडियो 2015 संकलक, माइक्रोसॉफ्ट द्वारा RiSE4fun के हिस्से के रूप में प्रदान किया गया है।
C ++ संकलन प्रक्रिया
जब आप C ++ प्रोग्राम विकसित करते हैं, तो अगला चरण प्रोग्राम को चलाने से पहले संकलित करना है। संकलन एक ऐसी प्रक्रिया है जो मानव पढ़ने योग्य भाषा में लिखे गए प्रोग्राम जैसे C, C ++ आदि को मशीन कोड में परिवर्तित करती है, जिसे सीधे सेंट्रल प्रोसेसिंग यूनिट द्वारा समझा जाता है। उदाहरण के लिए, यदि आपके पास एक C ++ सोर्स कोड फ़ाइल है जिसका नाम prog.cpp है और आप कंपाइल कमांड को निष्पादित करते हैं,
g++ -Wall -ansi -o prog prog.cpp
स्रोत फ़ाइल से निष्पादन योग्य फ़ाइल बनाने में 4 मुख्य चरण शामिल हैं।
C ++ प्रीप्रोसेसर एक C ++ सोर्स कोड फ़ाइल लेता है और हेडर (#include), मैक्रोज़ (#define) और अन्य प्रीप्रोसेसर निर्देशों से संबंधित होता है।
C ++ प्रीप्रोसेसर द्वारा निर्मित विस्तारित C ++ स्रोत कोड फ़ाइल को मंच के लिए असेंबली भाषा में संकलित किया गया है।
कंपाइलर द्वारा उत्पन्न कोडांतरक कोड को प्लेटफॉर्म के लिए ऑब्जेक्ट कोड में इकट्ठा किया जाता है।
कोडांतरक द्वारा निर्मित ऑब्जेक्ट कोड फ़ाइल एक साथ जुड़ी हुई है
किसी भी पुस्तकालय कार्यों के लिए ऑब्जेक्ट कोड फ़ाइलों के साथ एक पुस्तकालय या एक निष्पादन योग्य फ़ाइल का उत्पादन करने के लिए उपयोग किया जाता है।
preprocessing
प्रीप्रोसेसर प्रीप्रोसेसर निर्देशों को संभालता है, जैसे #include और #define। यह C ++ के सिंटैक्स का अज्ञेय है, यही कारण है कि इसका उपयोग सावधानी से किया जाना चाहिए।
यह एक समय में एक C ++ स्रोत फ़ाइल पर संबंधित फ़ाइलों की सामग्री के साथ #include निर्देशों को प्रतिस्थापित करके काम करता है (जो कि आमतौर पर सिर्फ घोषणाएं होती हैं), मैक्रोज़ (#define) के प्रतिस्थापन, और #if के आधार पर पाठ के विभिन्न भागों का चयन करके, #ifdef और #ifndef निर्देश।
प्रीप्रोसेसर पूर्वप्रक्रमक टोकन की एक धारा पर काम करता है। मैक्रो प्रतिस्थापन को अन्य टोकन के साथ टोकन की जगह के रूप में परिभाषित किया गया है (ऑपरेटर ## दो टोकन को विलय करने में सक्षम बनाता है जब यह समझ में आता है)।
इस सब के बाद, प्रीप्रोसेसर एक एकल आउटपुट का उत्पादन करता है जो ऊपर वर्णित परिवर्तनों के परिणामस्वरूप टोकन की एक धारा है। यह कुछ विशेष मार्करों को भी जोड़ता है जो संकलक को बताते हैं कि प्रत्येक पंक्ति कहां से आई है ताकि यह उन लोगों का उपयोग कर सके जो समझदार त्रुटि संदेश उत्पन्न कर सकते हैं।
इस स्तर पर कुछ त्रुटियों का उत्पादन #if और #error निर्देशों के चतुर उपयोग के साथ किया जा सकता है।
संकलक ध्वज के नीचे का उपयोग करके, हम प्रक्रिया को प्रीप्रोसेसिंग चरण पर रोक सकते हैं।
g++ -E prog.cpp
संकलन
संकलन कदम प्रीप्रोसेसर के प्रत्येक आउटपुट पर किया जाता है। कंपाइलर शुद्ध सी ++ स्रोत कोड (अब बिना किसी पूर्वप्रक्रमक निर्देश) को पार्स करता है और इसे विधानसभा कोड में परिवर्तित करता है। फिर अंतर्निहित बैक-एंड (टूलचैन में कोडांतरक) को इनवॉइस करता है जो उस कोड को मशीन कोड में कोडित करता है जो कुछ प्रारूप (ईएलएफ, सीओएफएफ, ए.ऑउट, ...) में वास्तविक बाइनरी फ़ाइल का उत्पादन करता है। इस ऑब्जेक्ट फ़ाइल में इनपुट में परिभाषित प्रतीकों का संकलित कोड (बाइनरी फॉर्म में) है। ऑब्जेक्ट फ़ाइलों में प्रतीकों को नाम से संदर्भित किया जाता है।
ऑब्जेक्ट फ़ाइलें उन प्रतीकों का उल्लेख कर सकती हैं जो परिभाषित नहीं हैं। यह मामला है जब आप एक घोषणा का उपयोग करते हैं, और इसके लिए एक परिभाषा प्रदान नहीं करते हैं। कंपाइलर को इससे कोई आपत्ति नहीं है, और जब तक स्रोत कोड अच्छी तरह से नहीं बन जाता है तब तक वह खुशी से ऑब्जेक्ट फाइल का उत्पादन करेगा।
कंपाइलर आमतौर पर आपको इस बिंदु पर संकलन बंद करने देते हैं। यह बहुत उपयोगी है क्योंकि इसके साथ आप प्रत्येक स्रोत कोड फ़ाइल को अलग से संकलित कर सकते हैं। इससे जो लाभ मिलता है, वह यह है कि अगर आपको केवल एक ही फाइल में बदलाव करना है तो आपको सब कुछ फिर से तैयार करने की जरूरत नहीं है।
उत्पादित वस्तु फ़ाइलों को बाद में आसानी से पुन: उपयोग करने के लिए, स्थिर पुस्तकालयों नामक विशेष अभिलेखागार में रखा जा सकता है।
यह इस स्तर पर है कि "नियमित" संकलक त्रुटियां, जैसे सिंटैक्स त्रुटियां या विफल अधिभार संकल्प त्रुटियां, रिपोर्ट की जाती हैं।
संकलन चरण के बाद प्रक्रिया को रोकने के लिए, हम -S विकल्प का उपयोग कर सकते हैं:
g++ -Wall -ansi -S prog.cpp
कोडांतरण
कोडांतरक ऑब्जेक्ट कोड बनाता है। UNIX प्रणाली पर आप ऑब्जेक्ट कोड फ़ाइलों को इंगित करने के लिए .o प्रत्यय (। MSJ पर .OBJ) के साथ फाइल देख सकते हैं। इस चरण में असेंबलर उन ऑब्जेक्ट फ़ाइलों को असेंबली कोड से मशीन स्तर के निर्देशों में परिवर्तित करता है और बनाई गई फ़ाइल एक रीकोसेबल ऑब्जेक्ट कोड है। इसलिए, संकलन चरण रिलोकेबल ऑब्जेक्ट प्रोग्राम उत्पन्न करता है और इस प्रोग्राम को फिर से संकलित किए बिना विभिन्न स्थानों में उपयोग किया जा सकता है।
असेंबली चरण के बाद प्रक्रिया को रोकने के लिए, आप -c विकल्प का उपयोग कर सकते हैं:
g++ -Wall -ansi -c prog.cpp
लिंक करना
लिंकर वह है जो ऑब्जेक्ट से अंतिम संकलन आउटपुट का उत्पादन करता है जो कोडांतरक निर्मित करता है। यह आउटपुट या तो एक साझा (या डायनामिक) लाइब्रेरी हो सकती है (और नाम समान होने पर, उनके पास पहले बताई गई स्थिर लाइब्रेरियों के साथ बहुत कुछ नहीं है) या एक निष्पादन योग्य है।
यह सही पते के साथ अपरिभाषित प्रतीकों के संदर्भों को प्रतिस्थापित करके सभी ऑब्जेक्ट फ़ाइलों को जोड़ता है। इन प्रतीकों में से प्रत्येक को अन्य ऑब्जेक्ट फ़ाइलों या पुस्तकालयों में परिभाषित किया जा सकता है। यदि उन्हें मानक पुस्तकालय के अलावा अन्य पुस्तकालयों में परिभाषित किया गया है, तो आपको उनके बारे में लिंकर को बताना होगा।
इस स्तर पर सबसे आम त्रुटियां परिभाषाएं या डुप्लिकेट परिभाषाएं गायब हैं। पूर्व का अर्थ है कि या तो परिभाषाएं मौजूद नहीं हैं (अर्थात वे लिखित नहीं हैं), या कि ऑब्जेक्ट फ़ाइल या लाइब्रेरी जहां वे रहते हैं, उन्हें लिंकर को नहीं दिया गया था। उत्तरार्द्ध स्पष्ट है: एक ही प्रतीक को दो अलग-अलग ऑब्जेक्ट फ़ाइलों या पुस्तकालयों में परिभाषित किया गया था।
कोड के साथ संकलन :: ब्लॉक (ग्राफिकल इंटरफ़ेस)
कोड :: ब्लॉक यहां डाउनलोड और इंस्टॉल करें । यदि आप विंडोज पर हैं, तो एक फाइल का चयन करने के लिए सावधान रहें, जिसमें नाम में
mingw
शामिल है, अन्य फाइलें किसी संकलक को स्थापित नहीं करती हैं।कोड खोलें :: ब्लॉक करें और "नया प्रोजेक्ट बनाएं" पर क्लिक करें:
"कंसोल एप्लिकेशन" चुनें और "गो" पर क्लिक करें:
"अगला" पर क्लिक करें, "सी ++" चुनें, "अगला" पर क्लिक करें, अपनी परियोजना के लिए एक नाम चुनें और इसे सहेजने के लिए एक फ़ोल्डर चुनें, "अगला" पर क्लिक करें और फिर "समाप्त करें" पर क्लिक करें।
अब आप अपने कोड को संपादित और संकलित कर सकते हैं। एक डिफ़ॉल्ट कोड जो प्रिंट करता है "हैलो वर्ल्ड!" कंसोल में पहले से ही है। अपने प्रोग्राम को संकलित करने और / या चलाने के लिए, टूलबार में तीन संकलन / रन बटनों में से एक को दबाएँ:
बिना चलने के संकलन करने के लिए, दबाएँ , फिर से संकलित किए बिना चलाने के लिए, दबाएँ और संकलन करने और फिर चलाने के लिए, दबाएँ ।
संकलित और डिफ़ॉल्ट "नमस्ते दुनिया!" कोड निम्नलिखित परिणाम देता है: