জি ++ এবং জিসিসির মধ্যে পার্থক্য কী? এর মধ্যে কোনটি সাধারণ সি ++ বিকাশের জন্য ব্যবহার করা উচিত?
জি ++ এবং জিসিসির মধ্যে পার্থক্য কী? এর মধ্যে কোনটি সাধারণ সি ++ বিকাশের জন্য ব্যবহার করা উচিত?
উত্তর:
gcc
এবং g++
তারা জিএনইউ সংকলক সংগ্রহের সংকলক-ড্রাইভার (যা এককালে কেবল জিএনইউ সি সংকলক ছিল )।
যদিও তারা স্বয়ংক্রিয়ভাবে নির্ধারণ করে যে কোন cc1
cc1plus
প্রকারের ( ...) ফাইল-টাইপের উপর নির্ভর করে কল করা উচিত, যদি না ওভাররাইড করা হয় তবে -x language
তাদের কিছু পার্থক্য রয়েছে।
তাদের ডিফল্টগুলির মধ্যে সম্ভবত সবচেয়ে গুরুত্বপূর্ণ পার্থক্য হ'ল তারা কোন লাইব্রেরিগুলি স্বয়ংক্রিয়ভাবে লিঙ্ক করে।
জিসিসি অনলাইন ডকুমেন্টেশন মতে লিংক অপশন এবং কিভাবে ছ ++, হয় প্রার্থনা , g++
সমতূল্য gcc -xc++ -lstdc++ -shared-libgcc
(1 ম একটি কম্পাইলার বিকল্প, 2nd দুই linker অপশন আছে) হয়। -v
বিকল্পটি দিয়ে এটি চালিয়ে উভয়ই পরীক্ষা করা যায় (এটি ব্যাকএন্ড টুলচেন কমান্ডগুলি চালিত করে)।
argv[0]
ব্যবহার করা উচিত তা পরীক্ষা করে দেখে। এটি ইউনিক্সের মূল ইউটিলিটিগুলির মধ্যে বেশ সাধারণ।
জিসিসি: জিএনইউ সংকলক সংগ্রহ
gcc
: জিএনইউ সি সংকলক
g++
: জিএনইউ সি ++ সংকলক
প্রধান পার্থক্য:
gcc
সংকলন করবে: *.c\*.cpp
যথাক্রমে সি এবং সি ++ হিসাবে ফাইলগুলি।g++
*.c\*.cpp
ফাইলগুলি সংকলন করবে: তবে সেগুলি সমস্ত সি ++ ফাইল হিসাবে বিবেচিত হবে।g++
অবজেক্ট ফাইলগুলি লিঙ্ক করতে ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে std C ++ লাইব্রেরিতে লিঙ্ক হয় (এটি gcc
করে না)।gcc
সংকলনকারী সি ফাইলগুলিতে কম পূর্বনির্ধারিত ম্যাক্রোগুলি রয়েছে।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++
, কারণ সেখানে গণিত, আরটিটিআই এবং ব্যতিক্রম সম্পর্কিত তথ্যের উপর নির্ভরশীলতা অনুপস্থিত থাকবে। প্রদত্ত পরীক্ষার কেস লিঙ্কগুলি বা ব্যর্থতা অপারেটিং সিস্টেমের উপর নির্ভর করে এবং পরীক্ষার ক্ষেত্রে কোন সি ++ বৈশিষ্ট্য ব্যবহার করা হবে তার উপর নির্ভর করে, সেই কারণেই সেই জ্ঞানটি সমস্ত ব্যবহারকারীকে ছেড়ে দেওয়ার পরিবর্তে জি ++ ড্রাইভারে তৈরি করা হয়েছে ।
gcc -lstdc++
অন্যান্য ওএসের তুলনায় অনেক কিছু করে, বিশেষত যখন লক্ষ্যটি এম্বেডেড প্ল্যাটফর্ম থাকে। ভাগ্যক্রমে, সেজন্য আমরা প্রথম স্থানে একটি জি ++ প্রেরণ করি।
-dumpspec
এম্বেড থাকা সিস্টেমকে লক্ষ্য করে কোনও ক্রস সংকলক (উদাহরণস্বরূপ) চালনা করেন তবে আপনি পার্থক্য দেখতে পাবেন। লিঙ্কার পার্থক্য ছাড়াও আরও অনেক কিছু রয়েছে ... যা আবার আপনার উত্তরটি সম্পর্কে যা ছিল (প্রিপ্রসেসর ম্যাক্রোস, একাধিক রানটাইম লাইব্রেরি অন্তর্ভুক্ত)। আমরা একে অপরের অতীত কথা বলে মনে হচ্ছে, কিন্তু একজন প্রাক্তন জিসিসি রক্ষণাবেক্ষণকারী হিসাবে, আমি আপনাকে নিশ্চয়তা দিচ্ছি যে আমি অগ্রভাগগুলি কী এবং কী কী তা সম্পর্কে আমি তার সাথে পরিচিত।
সি ++ এর জন্য আপনার জি ++ ব্যবহার করা উচিত।
এটি একই সংকলক (যেমন জিএনইউ সংকলক সংগ্রহ)) জিসিসি বা জি ++ বিভিন্ন ডিফল্ট বিকল্পগুলির সাথে একটি আলাদা ফ্রন্ট-এন্ড চয়ন করুন।
সংক্ষেপে: আপনি যদি g ++ ব্যবহার করেন তবে সম্মুখভাগটি লিঙ্কারে বলবে যে আপনি সি ++ স্ট্যান্ডার্ড লাইব্রেরির সাথে লিঙ্ক করতে চাইতে পারেন। জিসিসি ফ্রন্টএন্ড এটি করবে না (আপনি যদি সঠিক কমান্ড লাইন বিকল্পগুলি পাস করেন তবে এটি তাদের সাথে লিঙ্ক করতে পারে)।
মধ্যে পার্থক্য কি g++
এবং gcc
?
gcc
একক ভাষা "জিএনইউ সি সংকলক" থেকে একক ভাষায় "জিএনইউ সংকলক সংগ্রহ" হয়ে উঠেছে। "জিএনইউ সি কমপাইলার" শব্দটি এখনও মাঝে মাঝে সি প্রোগ্রামিংয়ের প্রসঙ্গে ব্যবহৃত হয়।
g++
হয় গনুহ কম্পাইলার কালেকশন জন্য সি ++ কম্পাইলার। যেমন gnat
অ্যাডা সংকলক gcc
। জিএনইউ সংকলক সংগ্রহ (জিসিসি) ব্যবহার করে দেখুন
উদাহরণস্বরূপ, উবুন্টু 16.04 এবং 18.04 man g++
কমান্ড GCC(1)
ম্যানুয়াল পৃষ্ঠাটি দেয়।
উবুন্টু 16.04 এবং 18.04 man gcc
বলেছে যে ...
g++
বেশিরভাগ হিসাবে একই বিকল্প গ্রহণ করেgcc
এবং এটি ডিফল্ট ...
... এর ব্যবহার
gcc
সি ++ লাইব্রেরি যুক্ত করে না।g++
এমন একটি প্রোগ্রাম যা জিসিসি কল করে এবং স্বয়ংক্রিয়ভাবে সি ++ লাইব্রেরির সাথে লিঙ্কিং নির্দিষ্ট করে। এটি -c, .h এবং .i ফাইলগুলিকে সি উত্স ফাইলের পরিবর্তে সি ++ উত্স ফাইল হিসাবে বিবেচনা করে -x ব্যবহার না করা হয়। সি ++ সংকলনে ব্যবহারের জন্য .h এক্সটেনশন সহ সি হেডার ফাইলটি প্রাক-কম্পাইল করার সময় এই প্রোগ্রামটিও কার্যকর।
gcc
বিকল্পগুলির মধ্যে gcc
এবং এর মধ্যে আরও তথ্যের জন্য ম্যান পৃষ্ঠাগুলি অনুসন্ধান করুন g++
।
সাধারণ সি ++ বিকাশের জন্য কোনটি ব্যবহার করা উচিত?
প্রযুক্তিগতভাবে, হয় gcc
বা g++
প্রয়োগযোগ্য বিকল্প সেটিংস সহ সাধারণ সি ++ বিকাশের জন্য ব্যবহার করা যেতে পারে। তবে, g++
ডিফল্ট আচরণটি স্বাভাবিকভাবেই একটি সি ++ বিকাশের সাথে সংযুক্ত থাকে।
উবুন্টু 18.04 man পৃষ্ঠা নিম্নলিখিত অনুচ্ছেদ যোগ করেছেন:
জিসিসি চালানোর স্বাভাবিক উপায় হ'ল এক্সিকিউটেবল নামে পরিচিত
gcc
, বাmachine-gcc
যখন ক্রস-সংকলন করা হয়, বাmachine-gcc-version
জিসিসির একটি নির্দিষ্ট সংস্করণ চালানো হয়। আপনি যখন সি ++ প্রোগ্রামগুলি সংকলন করেন,g++
তার পরিবর্তে আপনার জিসিসি শুরু করা উচিত ।
একটি উল্লেখযোগ্য পার্থক্য হ'ল আপনি যদি কোনও .c
ফাইলকে জিসিসিতে পাস করেন তবে এটি সি হিসাবে সংকলিত হবে
জি ++ এর ডিফল্ট আচরণ হ'ল .c
ফাইলগুলিকে সি ++ হিসাবে -x c
চিহ্নিত করা ( নির্দিষ্ট না করা পর্যন্ত )।
যদিও gcc এবং g ++ কমান্ডগুলি খুব অনুরূপ কাজ করে, g ++ আপনাকে একটি সি ++ প্রোগ্রাম সংকলন করতে অনুরোধ করতে আদেশ হিসাবে নকশা করা হয়েছে; এটি স্বয়ংক্রিয়ভাবে সঠিক কাজ করার উদ্দেশ্যে।
পর্দার আড়ালে, তারা সত্যই একই প্রোগ্রাম। আমি যেমন বুঝতে পেরেছি, উভয়ই সিদ্ধান্ত নেবে যে ফাইল প্রোগ্রাম এক্সটেনশনের উপর ভিত্তি করে কোনও প্রোগ্রামকে সি হিসাবে বা সি ++ হিসাবে সংকলন করতে হবে। উভয়ই সি ++ স্ট্যান্ডার্ড লাইব্রেরির সাথে লিঙ্ক করতে সক্ষম, তবে কেবল g ++ এটি ডিফল্টরূপে করে। সুতরাং যদি আপনার কাছে সি ++ তে লিখিত কোনও প্রোগ্রাম থাকে যা মানক লাইব্রেরির সাথে লিঙ্ক করার প্রয়োজন হয় না, সিসিটি সঠিক কাজটি করবে; তবে তারপরে, জি ++ হবে। সুতরাং সাধারণ সি ++ বিকাশের জন্য g ++ ব্যবহার না করার সত্যিই কারণ নেই।
আমি ইস্যুতে আগ্রহী হয়েছি এবং কিছু পরীক্ষা-নিরীক্ষা করেছি
আমি এখানে বর্ণনাটি পেয়েছি তবে এটি খুব ছোট।
তারপরে আমি আমার উইন্ডোজ মেশিনে gcc.exe এবং g ++ পরীক্ষা করতে চেষ্টা করেছি:
$ 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
আমি সি 98, সি 99, এবং সি ++ 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 সংকলক সংগ্রহ" সরঞ্জামটি চালানোর চেষ্টা করি:
$ 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;
}
ফলাফল:
প্রক্রিয়া গাছের দিকে নজর দিলে মনে হয় জিসিসি এবং জি ++ হ'ল অন্যান্য সরঞ্জামগুলির ব্যাকএন্ড, যা আমার পরিবেশে রয়েছে: cc1plus.exe, cc1.exe, collection2.exe, as.exe, ld.exe
আপনার যদি সঠিক এক্সটেনশন থাকে বা সঠিক -std -x পতাকা সেট করে থাকে তবে জিসিসি মেটাটুল হিসাবে সূক্ষ্মভাবে কাজ করে। এই দেখুন
"জিসিসি" জিএনইউ সংকলক সংগ্রহের জন্য একটি সাধারণ শর্টহ্যান্ড শব্দ। এটি উভয়ই সংকলকের সর্বাধিক সাধারণ নাম এবং যখন সি প্রোগ্রামগুলি সংকলনের উপর জোর দেওয়া হয় তখন নামটি ব্যবহৃত হয় (সংক্ষিপ্ত বিবরণটি আগে "GNU C Compiler" হিসাবে দাঁড়িয়েছিল)।
সি ++ সংকলন উল্লেখ করার সময়, কম্পাইলারটিকে "জি ++" কল করা স্বাভাবিক। যেহেতু কেবলমাত্র একটি সংকলক রয়েছে, ভাষা প্রসঙ্গ যাই হোক না কেন এটিকে "জিসিসি" বলা ঠিক; তবে, সি ++ প্রোগ্রাম সংকলনের উপর জোর দেওয়া হলে "জি ++" শব্দটি বেশি কার্যকর।
আপনি এখানে আরও পড়তে পারেন ।
আমি একটি লিনাক্স সিস্টেমে জিসিসি এবং জি ++ পরীক্ষা করছিলাম। মেকফাইল ব্যবহার করে, আমি "জিএনইউ মেক" দ্বারা ব্যবহৃত সংকলক সংজ্ঞায়িত করতে পারি। আমি "সি প্লাস প্লাস" এর তথাকথিত "গতিশীল মেমরি" সনাক্তকরণ বৈশিষ্ট্যটি দিয়ে পরীক্ষা করেছি:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
কেবল জি ++ আমার কম্পিউটারে সফলভাবে সংকলন করতে পারে যখন জিসিসি ত্রুটির প্রতিবেদন করবে
undefined reference to `operator new(unsigned long)'
সুতরাং আমার নিজস্ব উপসংহারটি জিসিসি সম্পূর্ণরূপে "সি প্লাস প্লাস" সমর্থন করে না। দেখে মনে হচ্ছে সি ++ উত্স ফাইলগুলির জন্য জি ++ চয়ন করা আরও ভাল বিকল্প।
জিসিসি এবং জি ++ উভয়ই জিএনইউ সংকলক। তারা উভয় সি এবং সি ++ সংকলন করে। পার্থক্যটি হল * .c ফাইলগুলির জন্য জিসিসি একে এসি প্রোগ্রাম হিসাবে বিবেচনা করে, এবং জি ++ এটিকে এসি ++ প্রোগ্রাম হিসাবে দেখায়। * .cpp ফাইলগুলি সি ++ প্রোগ্রাম হিসাবে বিবেচিত হয়। সি ++ সি এর একটি দুর্দান্ত সেট এবং বাক্য গঠন আরও কঠোর, সুতরাং প্রত্যয় সম্পর্কে সতর্ক থাকুন।
g++
এটি .cc
একটি সি ++ হিসাবে ব্যাখ্যা করবে - কেবল ফাইলের নাম এক্সটেনশন।