ubuntu gcc 安裝 使用


【gcc安裝】

                           “人多不足以依賴,要生存只有靠自己。” —— 拿破侖

 

gcc是什么:--------------------------

 

Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。

Gcc編譯器能將C、C++語言源程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的后綴,系統從文件的屬性來區分可執行文件和不可執行文件。

 

在Ubuntu下安裝GCC(和其他一些Linux系統有點不一樣):-----------------

方法1: sudo apt-get  build-dep  gcc 

方法2: sudo apt-get  install  build-essential 

( linux操作系統上面開發程序, 光有了gcc 是不行的,它還需要一個   build-essential軟件包,作用是提供編譯程序必須軟件包的列表信息,也就是說 編譯程序有了這個軟件包,它才知道 頭文件在哪 才知道庫函數在哪。)
 

安裝完了可以執行如下的命令來查看版本:gcc --version 

 

注意:

有些時候安裝不成功,比如

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

所以需要更新軟件包列表,這樣,apt-get才能知道每個軟件包的最新信息,從而正確地下載最新版本的軟件。

root@maolegemi:~# apt-get update

然后,再運行sudo apt-get  install  build-essential 就可以了!

 

 

apt-get update與upgrade的區別

apt-get是某些linux發行版使用的一個“包管理器”(還有別的發行版使用yum等,以及brew等其他平台上的包管理器,工作原理類似)。

包管理器的作用是從源(Source)服務器那里下載最新的軟件包列表,然后在你需要安裝某個軟件包(apt-get install)的時候從列表里面查詢這個軟件包的版本信息、系統要求、翻譯、依賴項(該軟件正常運行必須安裝的其它軟件)並且添加到同時安裝的列表里面,再查詢所有安裝列表里面的軟件包的.deb文件下載地址,最后批量下載,自動分析安裝順序然后安裝完成。

但是這個軟件包列表是不會被自動下載的,需要用戶使用apt-get update更新。這樣,apt-get才能知道每個軟件包的最新信息,從而正確地下載最新版本的軟件。

至於apt-get upgrade,則是對已經安裝的軟件包本身進行更新的過程。由於確定要更新的軟件包需要對本地安裝的版本和列表的版本進行比較,所以要在update以后運行這一條。

要求在install操作之前執行update和upgrade,實際上是確保本地軟件列表信息和已安裝軟件均為最新的過程。這樣做可以最大限度地確保新安裝的軟件包正常工作。

總而言之,update是更新軟件列表,upgrade是更新軟件。

作者:they遠去人海
鏈接:https://www.jianshu.com/p/42a1850bdcf6
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。

 

Gcc的執行過程---------------------------------------

用gcc由C語言源代碼文件生成可執行文件的過程經歷四個相互關聯的步驟∶

預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。

 

 

 

●預處理:命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。預處理器cpp根據以字符開頭#開頭的命令,修改原始C程序。比如xx.c中的第一行為 #include <stdio.h>,預處理器便將stdio.h的內容直接插入到程序中。

 

●編譯階段:接着調用cc1進行編譯,編譯器ccl 將文本文件xx.i 翻譯為匯編代碼xx.s。匯編語言是非常有用的,因為它將不同高級語言的不同編譯器提供了通用的輸出語言。例如,C和Fortran 的在此步編譯產生的輸出文件都是一樣的匯編語言。

 

●匯編階段:匯編器as 將xx.s 翻譯成機器語言, 保存在xx.o 中。這是個二進制文件.

 

●鏈接階段:當所有的目標文件都生成之后,gcc就調用ld來完成最后的鏈接,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方,這些鏈接文件一般是靜態庫和動態庫。例如,hello程序調用了printf 函數,這個函數是標准C庫中的一個函數,它被保存在一個名為printf.o 的文件中,這個文件必須以某種方式合並到我們的hello.o的程序中。 最終,得到hello 可執行文件,可以被加載到內存中由系統執行。

 

gcc基本用法:----------------------------

 

假設源程序文件名為test.c。
1) 無選項編譯鏈接
用法:#gcc test.c
作用:將test.c 預處理、編譯、匯編並鏈接形成可執行文件。這里未指定輸出文件,默認輸出為a.out。
2) 選項 -o
用法:#gcc test.c -o test
作用:將test.c預處理、編譯、匯編並鏈接形成可執行文件test。-o選項用來指定輸出文件的文件名。
3) 選項 -E
用法:#gcc -E test.c -o test.i
作用:將test.c預處理輸出test.i文件。
4) 選項 -S
用法:#gcc -S test.i 
作用:將預處理輸出文件test.i編譯成test.s文件。
5) 選項 -c
用法:#gcc -c test.s
作用:將匯編輸出文件test.s輸出為test.o文件。匯編的作用主要是將代碼轉化成系統認識的機器指令,然后生成“.o”目標文件。
6) 無選項鏈接
用法:#gcc test.o -o test
作用:將編譯輸出文件test.o鏈接成最終可執行文件test。
7) 選項 -O
用法:#gcc -O1 test.c -o test
作用:使用編譯優化級別1編譯程序。級別為1~3,級別越大優化效果越好,但編譯時間越長。

gcc多源文件的編譯方法

如果有多個源文件,基本上有兩種編譯方法:[假設有兩個源文件為test.c和testfun.c]
1) 多個文件一起編譯
用法:#gcc testfun.c test.c -o test

作用:將testfun.c和test.c分別編譯后鏈接成test可執行文件。

2) 分別編譯各個源文件,之后對編譯后輸出的目標文件鏈接。
用法:
#gcc -c testfun.c //將testfun.c編譯成testfun.o
#gcc -c test.c //將test.c編譯成test.o
#gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test

 

 

以上兩種方法相比較,第一中方法編譯時需要所有文件重新編譯,而第二種方法可以只重新編譯修改的文件,未修改的文件不用重新編譯。

 

 

 

gcc所遵循的部分約定規則---------------------------------

gcc則通過后綴來區別輸入文件的類別:

.c為后綴的文件,C語言源代碼文件;

.C或.cc或.cxx為后綴的文件,是C++源代碼文件;

.h為后綴的文件,是程序所包含的頭文件;

.a為后綴的文件,是由目標文件構成的檔案庫文件;---??
 

.i為后綴的文件,是已經預處理過的C源代碼文件;

.ii為后綴的文件,是已經預處理過的C++源代碼文件;

 

.o為后綴的文件,是編譯后的目標文件;

.s為后綴的文件,是匯編語言源代碼文件;

 

.S為后綴的文件,是經過預編譯的匯編語言源代碼文件。

.m為后綴的文件,是Objective-C源代碼文件;

 

其他gcc編譯選項:-----------------------------------------------------------

-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。

-O,對程序進行優化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。

-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數

 

REF:

Ubuntu點滴--apt-get update和upgrade的作用 - 黑翼天使23 - 博客園  https://www.cnblogs.com/bwangel23/p/4625245.html

Ubuntu apt update 和 apt-get update 有什么區別? - V2EX  https://www.v2ex.com/t/561613

apt-get update和apt-get upgrade的區別 - 上官雨澤(微信:13631252376) - CSDN博客  https://blog.csdn.net/qq_19004627/article/details/79560818

apt-get update與upgrade的區別 - 簡書  https://www.jianshu.com/p/42a1850bdcf6

 

https://blog.csdn.net/anneqiqi/article/details/51725658

《Computer Systems: A Programmer's Perspective》
---------------------
作者:擁抱無常_庭前花開
來源:CSDN
原文:https://blog.csdn.net/qq_35865125/article/details/80519030
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM