現代cc編譯器
❶ 什麼是GCC編譯器
Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。 Gcc編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的後綴,系統從文件的屬性來區分可執行文件和不可執行文件。而gcc則通過後綴來區別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規則。 .c為後綴的文件,c語言源代碼文件; .a為後綴的文件,是由目標文件構成的檔案庫文件; .C,.cc或.cxx 為後綴的文件,是C++源代碼文件; .h為後綴的文件,是程序所包含的頭文件; .i 為後綴的文件,是已經預處理過的C源代碼文件; .ii為後綴的文件,是已經預處理過的C++源代碼文件; .m為後綴的文件,是Objective-C源代碼文件; .o為後綴的文件,是編譯後的目標文件; .s為後綴的文件,是匯編語言源代碼文件; .S為後綴的文件,是經過預編譯的匯編語言源代碼文件。 Gcc的執行過程 雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。 命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為後綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。 Gcc的基本用法和選項 在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。 Gcc最基本的用法是∶gcc [options] [filenames] 其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。 -c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。 -g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。 -O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。 -O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。 -Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶ A)#include B)#include 「myinc.h」 其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而對於B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中
❷ AIX里怎麼安裝CC編譯器
你要安裝的是IBM的xlc嗎?還是gcc編譯器? 如果是xlc,首先在操作系統中安裝依賴的文件集,比如bos.adt等等。 然後使用installp命令或者smit installp快捷菜單安裝xlc,如果依賴的文件集沒有安裝,安裝信息會有提示,並報錯。 如果是gcc編譯器,...
❸ 推薦幾個C++的編譯器
visual c++ 功能強大,不過需要的容量也很大 ,
TC2.0也不錯 很適合初學者 不過不是很標准 下面有它們的下載網站 你自己根據自己的情況,自己選擇吧,我的建議是VC6.0
TC2.0的:
http://218.64.170.103/dload1.html?cid=
http://218.64.170.103/dload1.html?cid=
VC6.0 的:
http://218.64.170.103/dload1.html?cid=
http://218.64.170.103/dload1.html?cid=
❹ minix裡面自帶CC編譯器嗎
我用的3.1.2a自帶的
只要鍵入cc 源程序名 -o 輸出轉向就可以了
如 cc test.c -o result.txt
❺ cc編譯器 怎麼設置 讓他出現警告 不是錯誤
沒法設置的,警告是說你的錯誤不至於讓程序崩潰,能崩潰的就顯示為錯誤。
❻ CC和gcc是一樣的編譯器嗎
cc是Unix系統的C Compiler,而gcc則是GNU Compiler Collection,GNU編譯器套裝。gcc原名為Gun C語言編譯器,因為它原本只能處理C語言,但gcc很快地擴展,包含很多編譯器(C、C++、Objective-C、Ada、Fortran、Java)。因此,它們是不一樣的,一個是古老的C編譯器,一個是GNU編譯器集合,gcc裡面的C編譯器比cc強大多了,因此沒必要用cc。
下載不到cc的原因在於:cc來自於昂貴的Unix系統,cc是商業軟體。
Linux下的cc是gcc符號連接,可以通過$ls –l /usr/bin/cc來簡單察看,該變數是make程序的內建變數,默認指向gcc。cc符號鏈接和變數存在的意義在於源碼的移植性,可以方便的用gcc來編譯老的用cc編譯的Unix軟體,甚至連makefile都不用改在,而且也便於Linux程序在Unix下編譯。
❼ cc gcc編譯器怎麼使用
gcc --help可以看gcc的編譯選項
常用的有
gcc -c xcxcx.c : -c 編譯C代碼,生成該文件的obj文件
gcc xcxcx.o -o dest : -o 鏈接各個obj文件,生成目標執行程序
-I : (這里是大寫i) 表示頭文件路徑
-L : 表示庫文件路徑
-l : (這里是小寫的L) 表示需要鏈接的庫文件
-O: (這里是大寫英文o) 表示優化參數
-WALL: 表示warning等級
這里是一句完整的話
g++ -Wl,-rpath,/usr/local/Trolltech/QtEmbedded-static/lib -o Qt_V4L_ShowImage main.o myWidget.o v4lThread.o moc_myWidget.o moc_v4lThread.o -L/usr/local/Trolltech/QtEmbedded-static/lib -lQtGui -L/usr/local/tslib/lib -L/usr/local/Trolltech/QtEmbedded-static/lib -L/usr/local/lib -L/home/root/ffmpeg/lib -lts -lQtNetwork -lQtCore -lc -lgcc -lm -lrt -ldl -lpthread -lavcodec -lavformat -lavutil -lx264 -xvidcore -lcv -lhighgui -lcvaux -lcxcore
不過還是自己看一下gcc的help比較好,那裡講的全面些
❽ c語言編譯器哪個好
1.
GCC
大名鼎鼎的GNU的C/C++/Obj-C編譯器,
當前版本是2.8.1,
但據說與2.7.*有兼容性
問題.
而使用較廣的是gcc
2.7.2系列,
如RedHat5中帶的就是gcc
2.7.2.3
有時候在Cyrix上用gcc會有些問題,
因此有一套針對Cyrix特點的gcc
2.7.2.3
我這里有RedHat5的rpms
ftp://166.111.68.98/pub/Warez-CD/Huricane-contrib
(Cyrix
2.7.2.3
&
2.8.1)
其基本結構就是一個front
end和back
end,
/usr/bin/gcc
就是個front
end,
其kernel東西都放在
/usr/lib/gcc-lib下面,
cpp是C預處理器,
cc1*的1M多的就是編譯器的核心模塊了
cc1
C
compiler
cc1plus
C++
compiler
cc1obj
Object-C
compiler
但gcc並沒有集成Fortran的compiler,
一般要用f2c轉成C後才用gcc編譯
好象也還有個g77
Fortran
compiler吧?
gcc的不斷發展完善使許多commercial
compiler都相形見絀,
那當然,
gcc/emacs
都由GNU創始人Richard
Stallman手創,
是GNU的旗艦產品,
質量當然沒得說了:-)
由於
Unix平台的高度可移植性,
gcc幾乎在各種常見的Unix平台上都有,
即使是
Win32/DOS也有gcc的port.
比如說該死的Solaris普通版本連compiler都沒有,
也
就只好用gcc了...
2.
EGCS(Experimental/Enhanced
GNU
Compiler
System)
這是gcc的發展方向,
把fortran等編譯器集成進來,
也許還會有Pascal?
它的構造很清晰,
把對gcc的各種改進/port都集成回去.
如gcc
2.7系列據說是
沒有對Pentium進行優化的,
而egcs則把pgcc對Pentium的一些優化集成進去了
現在gcc的開發工作主要就是egcs,
由Cygnus公司領導(?),
這Cygnus公司還是很
不錯的,
還出了GNU-Win32,
SourceNavigator等,
是GNU的堅實擁護者:-))
http://egcs.cygnus.com
包括了C/C++/Obj-C/Fortran
編譯器,
當前最新版本1.0.2,
還在不斷開發中
昨天download發現KDE
Beta4都用egcs編譯了
:-)
Fortran集成進來後在/usr/lib/gcc-lib下又多了個f771的back
end,
當然
還是g77/f77
編譯
我這里有egcs
1.0.2
的rpm
在RH5-CD/collect下面
3.
PGCC(Pentium
GCC)
http://www.gcc.ml.org
針對Pentium
CPU進行了編譯器優化的compiler
pgcc據說用JPEG壓縮解壓縮測試最快可比gcc快
30%!
新版的pgcc都是基於egcs的,
以一個patch的形式release
❾ 現代C/C++編譯器有多智能
最近在搞C/C++代碼的性能優化,發現很多時候自以為的優化其實編譯器早就優化過了,得結合反匯編才能看出到底要做什麼樣的優化。
請熟悉編譯器的同學結合操作系統和硬體談一談現代c/c++編譯器到底有多智能吧。哪些書本上的優化方法其實早就過時了?
以及程序員做什麼會讓編譯器能更好的自動優化代碼?
舉個栗子:
1,循環展開,大部分編譯器設置flag後會自動展開;
2,順序SIMD優化,大部分編譯器設置flag後也會自動優化成SIMD指令;
3,減少中間變數,大部分編譯器會自動優化掉中間變數;
etc.
查看代碼對應的匯編:
Compiler Explorer
【以下解答】
舉個之前看過的例子:
int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = ret * 131 + *s; ++ s; } ret %= N; if (ret < 0) ret += N; //注意這句 return ret;}
【以下解答】
舉個簡單例子,一到一百求和
#include int sum() { int ret= 0; int i; for(i = 1; i <= 100; i++) ret+=i; return ret;}int main() { printf("%d\n", sum()); return 0;}
【以下解答】
話題太大,碼字花時間…
先放傳送門好了。
請看Google的C++編譯器組老大Chandler Carruth的演講。這個演講是從編譯器研發工程師的角度出發,以Clang/LLVM編譯C++為例,向一般C++程序員介紹理解編譯器優化的思維模型。它講解了C++編譯器會做的一些常見優化,而不會深入到LLVM具體是如何實現這些優化的,所以即使不懂編譯原理的C++程序員看這個演講也不會有壓力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
演示稿:https://meetingcpp.com/tl_files/mcpp/2015/talks/meetingcxx_2015-understanding_compiler_optimization_themed_.pdf
錄像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不開請自備工具…)
Agner Fog寫的優化手冊也永遠是值得參考的文檔。其中的C++優化手冊:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog
要稍微深入一點的話,GCC和LLVM的文檔其實都對各自的內部實現有不錯的介紹。
GCC:GNU Compiler Collection (GCC) Internals
LLVM:LLVM』s Analysis and Transform Passes
========================================
反模式(anti-patterns)
1. 為了「優化」而減少源碼中局部變數的個數
這可能是最沒用的手工「優化」了。特別是遇到在高級語言中「不用臨時變數來交換兩個變數」這種場景的時候。
看另一個問題有感:有什麼像a=a+b;b=a-b;a=a-b;這樣的演算法或者知識? - 編程
2. 為了「優化」而把應該傳值的參數改為傳引用
(待續…)
【以下解答】
推薦讀一讀這里的幾個文檔:
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X
其中第一篇:http://www.agner.org/optimize/optimizing_cpp.pdf
講解了C++不同領域的優化思路和問題,還有編譯器做了哪些優化,以及如何代碼配合編譯器優化。還有優化多線程、使用向量指令等的介紹,推薦看看。
感覺比較符合你的部分需求。
【以下解答】
一份比較老的slides:
http://www.fefe.de/source-code-optimization.pdf
【以下解答】
利用C++11的range-based for loop語法可以實現類似python里的range生成器,也就是實現一個range對象,使得
for(auto i : range(start, stop, step))
【以下解答】
我覺得都不用現代。。。。寄存器分配和指令調度最智能了
【以下解答】
每次編譯poco庫的時候我都覺得很為難GCC
【以下解答】
有些智能並不能保證代碼變換前後語義是等價的
【以下解答】
誒誒,我錯了各位,GCC是可以藉助 SSE 的 xmm 寄存器進行優化的,經 @RednaxelaFX 才知道應該添加 -march=native 選項。我以前不了解 -march 選項,去研究下再來補充為什麼加和不加區別這么大。
十分抱歉黑錯了。。。以後再找別的點來黑。
誤導大家了,實在抱歉。(??ˇ?ˇ??)
/*********以下是並不正確的原答案*********/
我是來黑 GCC的。
最近在搞編譯器相關的活,編譯OpenSSL的時候有一段這樣的代碼:
BN_ULONG a0,a1,a2,a3; // EmmetZC 註:BN_ULONG 其實就是 unsigned longa0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
【以下解答】
提示:找不到對象
【以下解答】
忍不住抖個機靈。
私以為正常寫代碼情況下編譯器就能優化,才叫智能編譯器。要程序員絞盡腦汁去考慮怎麼寫代碼能讓編譯器更好優化,甚至降低了可讀性,那就沒有起到透明屏蔽的作用。
智能編譯器應該是程序猿要較勁腦汁才能讓編譯器不優化。
理論上是這樣的。折疊我吧。
【以下解答】
編譯器智能到每次我都覺得自己很智障。
【以下解答】
雖然題主內容里是想問編譯器代碼性能優化方面的內容,但題目里既然說到編譯器的的智能,我就偏一下方向來說吧。
有什麼更能展示編譯器的強大和智能?
自然是c++的模版元編程
template meta programming
簡單解釋的話就是寫代碼的代碼,寫的還是c++,但能讓編譯器在編譯期間生成正常的c++代碼。
沒接觸過的話,是不是聽上去感覺就是宏替換的加強版?感覺不到它的強大呢?
只是簡單用的話,效果上這樣理解也沒什麼
但是一旦深入下去,尤其翻看大神寫的東西,這明明看著就是c++的代碼,但TM怎麼完全看不懂他在干什麼?後來才知道這其實完全是另外一個世界,可是明明是另外一個世界的東西但它又可以用來做很多正常c++能做的事....
什麼?你說它好像不能做這個,不能做那個,好像做不了太多東西,錯了,大錯特錯。就像你和高手考試都考了100分的故事一樣,雖然分數一樣,但你是努力努力再努力才得了滿分,而高手只是因為卷面分只有100分.....在元編程面前,只有想不到,沒有做不到。
再回頭看看其他答案,編譯器順手幫你求個和,丟棄下無用代碼,就已經被驚呼強大了,那模板元編程這種幾乎能在編譯期直接幫你「生成」包含復雜邏輯的c++代碼,甚至還能間接「執行」一些復雜邏輯,這樣的編譯器是不是算怪獸級的強大?
一個編譯器同時支持編譯語法相似但結果不同卻又關聯的兩種依賴語言,這個編譯器有多強大多智能?
寫的人思維都要轉換幾次,編譯器轉著圈嵌著套翻著番兒地編譯代碼的代碼也肯定是無比蛋疼的,你說它有多強大多智能?
一個代碼創造另外一個代碼,自己能按照相似的規則生成自己,是不是聽上去已經有人工智慧的發展趨勢了?
上帝說,要有光,於是有了光。
老子曰,一生二,二生三,三生萬物。
信c++,得永生!
===
FBI WARNING:模板元編程雖然很強大,但也有不少缺點,尤其對於大型項目,為了你以及身邊同事的身心健康,請務必適度且謹慎的使用。勿亂入坑,回頭是岸。
【以下解答】
c++11的auto自動類型推斷算么....
【以下解答】
智能到開不同級別的優化,程序行為會不同 2333
【以下解答】
這個取決於你的水平
❿ Linux下C編譯器cc的參數詳解
Linux 下面 cc 就是 gcc ……
你可以去 gcc.gnu.org 看看 gcc 的文檔,參數多的頭暈。
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Invoking-GCC.html#Invoking-GCC