gcc編譯器與g++編譯器的區別

? ? ? ? gcc與g++編譯器的程序文件分別為:/usr/bin/g++和/usr/bin/gcc。

? ? ? ??gcc 和 GCC 是兩個不同的東西,GCC:GNU Compiler Collection(GUN 編譯器集合),它可以編譯C、C++、JAV、Fortran、Pascal、Object-C、Ada等語言。gcc是GCC中的GUN C Compiler(C 編譯器);g++是GCC中的GUN C++ Compiler(C++編譯器)。

? ? ? ? 首先需要強調一點,gcc與g++都可以編譯C和C++源程序,對于.c文件gcc當做c語言處理,g++當做c++處理;對于.cpp文件gcc和g++均當做c++處理。C++是C的超集,但是兩者對語法的要求標準是不一樣的,C++對語法的要求更加嚴格一些,更加規則。

? ? ? ?在預處理階段,gcc與g++對.c和.cpp產生的效果是一樣的,即該階段兩者都可以正常進行。

? ? ? ?在編譯階段,g++實質上是調用的是gcc,因此在編譯階段兩者是一樣的,但是gcc程序不能自動將c++程序使用的庫文件進行鏈接。在此階段雖然不需要對庫文件進行鏈接,但是同樣需要識別C++使用的庫文件,從而對庫文件進行申明,因此gcc在編譯階段直接編譯C++程序會報錯。而g++可以成功編譯生成匯編語言代碼。

? ? ? ? 在匯編階段,都是利用as程序將匯編語言代碼.s譯為機器代碼.o,因此也完全一樣。

? ? ? ? 在鏈接階段,gcc無法將C++程序生成的.o文件轉化為可執行程序,因為gcc程序不能自動將c++程序使用的庫文件進行鏈接,而g++可以正常進行。

? ? ? ? 因此,gcc與g++在執行C程序的過程中所做工作是一樣的(g++調用了gcc來完成各項工作),都可以正常運行。gcc和g++的區別主要是在對cpp文件的編譯和鏈接過程中,因為cpp和c文件中庫文件的命名方式不同,g++既可以編譯C又可以編譯C++是因為g++在內部做了處理,默認編譯C++程序,但如果遇到C程序,它會直接調用gcc去編譯。

? ? ? ??extern "C"對于gcc和g++的效果是一樣的。extern "C"的主要作用就是為了能夠正確實現C++代碼調用其他C語言代碼。加上extern "C"后,會指示編譯器這部分代碼按C語言的進行編譯,而不是C++的。由于C++支持函數重載,因此編譯器編譯函數的過程中會將函數的參數類型也加到編譯后的代碼中,而不僅僅是函數名;而C語言并不支持函數重載,因此編譯C語言代碼的函數時不會帶上函數的參數類型,一般之包括函數名。

? ? ? ? 但是為了能夠是gcc能正常完成C++的編譯,需要在編譯和鏈接階段采用- lstdc++參數,其余操作不變。g++的使用完全同gcc,只是不需要加- lstdc++參數,如: g++ -E hello.c -o hello.i? ? g++ hello.cpp -o hello? ? ? ?gcc -S -lstdc++ hello.ii -o hello.s(hello.ii是hello.cpp經過預處理產生的)? ? ?gcc -lstdc++ hello.cpp -o hello??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385459.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1. 排序算法

一、概述 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍…

1036. 跟奧巴馬一起編程(15)

美國總統奧巴馬不僅呼吁所有人都學習編程,甚至以身作則編寫代碼,成為美國歷史上首位編寫計算機代碼的總統。2014年底,為慶祝“計算機科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機代碼:在屏幕上畫一個正方形。現在…

庫文件與頭文件

首先說明庫文件與頭文件在gcc中的具體使用方法,然后說明兩者的區別與聯系。 庫文件即庫函數,如printf和scanf函數。以libgtdf.so庫文件為例(庫文件在命名時都以lib開頭,因此使用-l選項去鏈接指定的庫文件時可以省略lib三個字母&am…

gcc的常用參數

-c 編譯成目標文件.o(只編譯不鏈接) gcc -c hello.s -o hello.o -o 指出輸出文件名,輸出文件名跟在-o后面。如果不使用這一選項,則缺省的輸出文件名為a.out。gcc hello.c -o hello.exe(在Linux中該項后綴名無要求&a…

1027. 打印沙漏(20)

本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印 ************ *****所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減…

【C++ Priemr | 15】構造函數與拷貝控制

繼承的構造函數 1. 簡介: 子類為完成基類初始化,在C11之前,需要在初始化列表調用基類的構造函數,從而完成構造函數的傳遞。如果基類擁有多個構造函數,那么子類也需要實現多個與基類構造函數對應的構造函數。 class …

C命令行參數

C命令行參數的作用是在執行程序時,可以將命令行的參數傳值給C程序內部,這樣就可以從外部控制程序,而不是在代碼內對這些值進行硬編碼。命令行參數是使用main函數來處理的,argc是指參數的個數,為int類型;arg…

剖析數組名、函數名(不是指針常量,更不是指針)

對于一個數組,如 int a[4]; 如果只是給出數組名a,編譯器不知道該取該數組的第幾個元素,因此編譯器不會自動取值,而是返回該數組的首地址(第一個元素的地址)。其實,數組名a就是數組本身&#xf…

【C++ Priemr | 15】面向對象程序設計

類型準換與繼承 為了支持c的多態性,才用了動態綁定和靜態綁定。 需要理解四個名詞: 對象的靜態類型:對象在聲明時采用的類型,是在編譯期確定的。對象的動態類型:目前所指對象的類型,是在運行期決定的。對…

linux里source、. 、sh、bash、./有什么區別

轉載:https://www.cnblogs.com/pcat/p/5467188.html 1.source a.sh source可以簡寫為“.”,即. a.sh 注意中間有空格,在當前shell內去讀取、執行a.sh,而a.sh不需要有"執行權限"。 2.sh a.sh 和 bash a.sh 都是打開…

【C++ Priemr | 15】虛函數表剖析(三)

一、虛擬菱形繼承 #include <iostream> using namespace std;class B { public:int _b; };class C1 :virtual public B { public:int _c1; };class C2 :virtual public B { public:int _c2; };class D :public C1, public C2 { public:int _d; };int main() {cout <&…

gcc的警告提示信息

gcc包含完整的出錯檢查和警告提示功能。采用-pedantic選項&#xff0c;對于不符合ANSI/ISO標準的源代碼會產生相應的警告信息。如&#xff1a;gcc -pedantic hello.c -o hello (main函數返回類型為int&#xff0c;且函數體內要有return 語句&#xff0c;一般為 return 0;) -pe…

1037. 在霍格沃茨找零錢(20)

如果你是哈利波特迷&#xff0c;你會知道魔法世界有它自己的貨幣系統 —— 就如海格告訴哈利的&#xff1a;“十七個銀西可(Sickle)兌一個加隆(Galleon)&#xff0c;二十九個納特(Knut)兌一個西可&#xff0c;很容易。”現在&#xff0c;給定哈利應付的價錢P和他實付的錢A&…

【Leetcode | 6】136. 只出現一次的數字

給定一個非空整數數組&#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。 說明&#xff1a; 你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎&#xff1f; 示例 1: 輸入: [2,2,1] 輸出: 1 示例 2: 輸入…

gcc的優化功能

代碼優化的目的是改善程序的執行性能。gcc提供的代碼優化功能非常強大&#xff0c;它通過參數-On來控制優化代碼的生成&#xff0c;其中n為優化級別的整數&#xff0c;比較典型的范圍是從0變化到2或3&#xff08;與版本有關&#xff09;。 編譯時通過使用選項-O可以告訴gcc同時…

gcc編譯多個源代碼文件的過程(引出makefile)

由foo1.c foo2.c foo3.c 3個源文件組成的源程序生成最終的可執行程序foo的命令&#xff1a; gcc foo1.c foo2.c foo3.c -o foo 如果處理的源文件不止一個&#xff0c;則gcc會依次對每個文件進行預處理、編譯、匯編&#xff0c;最后將所有的目標代碼和庫文件進行&#xff0c;鏈…

觀擦者模式

/********************************************************************created: 2006/07/20filename: Observer.hauthor: 李創http://www.cppblog.com/converse/purpose: Observer模式的演示代碼 *********************************************************************/…

程序的裝入和鏈接

注&#xff1a;這是本人學習湯小丹等編寫的計算機操作系統&#xff08;西安電子科技大學出版社&#xff09;的學習筆記&#xff0c;因此許多引用來源于此書&#xff0c;在正文中就不注明了&#xff01; 程序在運行前需要經過以下步驟&#xff1a;編譯程序對源程序進行編譯生成…

內存對齊

1. 對齊原則&#xff1a; 數據成員對齊規則&#xff1a;結構(struct)(或聯合(union))的數據成員&#xff0c;第一個數據成員放在offset為0的地方&#xff0c;以后每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中&#xff0c;比較小的那個進行。結構(或…

1006. 換個格式輸出整數 (15)

讓我們用字母B來表示“百”、字母S表示“十”&#xff0c;用“12...n”來表示個位數字n&#xff08;<10&#xff09;&#xff0c;換個格式來輸出任一個不超過3位的正整數。例如234應該被輸出為BBSSS1234&#xff0c;因為它有2個“百”、3個“十”、以及個位的4。 輸入格式&a…