高級cc編譯技術
Linux 下面 cc 就是 gcc ……
你可以去 gcc.gnu.org 看看 gcc 的文檔,參數多的頭暈。
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Invoking-GCC.html#Invoking-GCC
B. 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. c語言文件的編譯與執行的四個階段並分別描述是什麼
採納了加我不懂問我</b> 一 C編譯過程概述 目前Linux下最常用的C語言編譯器是GCC(GNU Compiler Collection),它是GNU項目中符合ANSI C標準的編譯系統,能夠編譯用C、C++和Object C等語言編寫的程序.GCC不僅功能非常強大,結構也異常靈活.最值得稱道的一點就是它可以通過不同的前端模塊來支持各種語言,如Java、Fortran、Pascal、Mola-3和Ada等. Linux系統下的gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。 使用GCC編譯程序時,編譯過程可以被細分為四個階段:
◆ 預處理(Pre-Processing)
◆ 編譯(Compiling)
◆ 匯編(Assembling)
◆ 鏈接(Linking) 二 編譯過程中各種文件介紹 1.以擴展名區分文件類型.c為後綴的文件,C語言源代碼文件;
.a為後綴的文件,是由目標文件構成的檔案庫文件;
.C,.cc或.cxx 為後綴的文件,是C++源代碼文件;
.h為後綴的文件,是程序所包含的頭文件;
.i 為後綴的文件,是已經預處理過的C源代碼文件;
.ii為後綴的文件,是已經預處理過的C++源代碼文件;
.m為後綴的文件,是Objective-C源代碼文件;
.o為後綴的文件,是編譯後的目標文件;
.s為後綴的文件,是匯編語言源代碼文件;
.S為後綴的文件,是經過預編譯的匯編語言源代碼文件。 2.LINUX目標文件描述 LINUX 平台下三種主要的可執行文件格式:a.out(assembler and link editor output 匯編器和鏈接編輯器的輸出)、COFF(Common Object File Format 通用對象文件格式)、ELF(Executable and Linking Format 可執行和鏈接格式)。其中ELF是x86 Linux系統 下的一種常用目標文件(object file)格式,有三種主要類型: (1)適於連接的可重定位文件(relocatable file),可與其它目標文件一起創建可執行文件和共享目標文件。編譯產生的.o文件就屬於這類。
(2)適於執行的可執行文件(executable file),用於提供程序的進程映像,載入到內存執行。這就是編譯、鏈接之後形成的最終文件。
(3)共享目標文件(shared object file),連接器可將它與其它可重定位文件和共享目標文件連接成其它的目標文件,動態連接器又可將它與可執行文件和其它共享目標文件結合起來創建一個進程映像。這就是庫文件,只指動態庫文件。 詳細了解請看本人收藏的《LINUX可執行文件分析》 三 編譯過程詳解 C語言的編譯鏈接過程要把我們編寫的一個c程序(源代碼)轉換成可以在硬體上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯為機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啟動代碼和用到的庫文件進行組織形成最終生成可執行代碼的過程。過程圖解如下:
從圖上可以看到,整個代碼的編譯過程分為編譯和鏈接兩個過程,編譯對應圖中的大括弧括起的部分,其餘則為鏈接過程。 1. 編譯過程 編譯過程又可以分成兩個階段:編譯和匯編。 1)編譯 編譯是讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,源文件的編譯過程包含兩個主要階段: 第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。如#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中。這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。主要是以下幾方面的處理: (1)宏定義指令, 如 #define a b
對於這種偽指令,預編譯所要做的是將程序中的所有a用b替換,但作為字元串常量的 a則不被替換。還有 #undef,則將取消對某個宏的定義,使以後該串的出現不再被替換。 (2)條件編譯指令, 如#ifdef,#ifndef,#else,#elif,#endif等。
這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉。
(3)頭文件包含指令, 如#include "FileName"或者#include <FileName>等。 在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在 /usr/include目錄下。在程序中#include它們要使用尖括弧(< >)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。
例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
第二個階段編譯、優化階段,經過預編譯得到的輸出文件中,只有常量;如數字、字元串、變數的定義,以及C語言的關鍵字,如main,if,else,for,while,{,}, +,-,*,\等等。
編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼表示或匯編代碼。
優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬體環境也有很大的關系。優化一部分是對中間代碼的優化。這種優化不依賴於具體的計算機。另一種優化則主要針對目標代碼的生成而進行的。
對於前一種優化,主要的工作是刪除公共表達式、循環優化(代碼外提、強度削弱、變換循環控制條件、已知量的合並等)、復寫傳播,以及無用賦值的刪除,等等。 後一種類型的優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體寄存器存放的有關變數的值,以減少對於內存的訪問次數。另外,如何根據機器硬體執行指令的特點(如流水線、RISC、CISC、VLIW等)而對指令進行一些調整使目標代碼比較短,執行的效率比較高,也是一個重要的研究課題。
2)匯編
匯編實際上指把匯編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段:代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。數據段:主要存放程序中要用到的各種全局變數或靜態的數據。一般數據段都是可讀,可寫,可執行的。 2. 鏈接過程 由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠誒操作系統裝入執行的統一整體。
根據開發人員指定的同庫函數的鏈接方式的不同,鏈接處理可分為兩種: (1)靜態鏈接 在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。 (2)動態鏈接
在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。
對於可執行文件中的函數調用,可分別採用動態鏈接或靜態鏈接的方法。使用動態鏈接能夠使最終的可執行文件比較短小,並且當共享對象被多個進程使用時能節約一些內存,因為在內存中只需要保存一份此共享對象的代碼。但並不是使用動態鏈接就一定比使用靜態鏈接要優越。在某些情況下動態鏈接可能帶來一些性能上損害。四 編譯過程實例描述 linux中使用的gcc編譯器把上述的幾個過程集成,一個命令就能完成編譯的整個過程。為了詳細說明每個步驟,下面我們將分部執行。下圖是gcc代理的編譯過程
常式: 在linux下創建文件hello.c,內容如下,
#include <stdio.h>
int main(void)
{
printf ("Hello,everybody!\n");
return 0;
} ◆ 預處理(Pre-Processing)
使用-E參數可以讓GCC在預處理結束後停止編譯過程,對應的命令是cpp,
# gcc -E hello.c -o hello.i 用編輯器打開hello.i,可以看到stdio.h文件被展開到了hello.i中。 ◆ 編譯(Compiling)
使用-S參數將hello.i編譯為匯編程序,使用的命令是cc -S,
#gcc –S hello.i –o hello.s 用編輯器打開hello.s,顯然已經變成了匯編代碼。 ◆ 匯編(Assembling)
使用-c參數將hello.s編譯為目標文件,對應的命令是as,
#gcc –c hello.s –o hello.o 可以利用工具readelf或者objmp讀出hello.o的信息。 ◆ 鏈接(Linking) 產生可執行文件,利用命令ld
# gcc hello.o -o hello
利用readelf,可以看到hello.o和hello文件的區別。
D. UNIX下 用CC如何編譯多個c語言源程序文件
用makefile啊,用makefile可以很方便地編譯多個源文件的程序。unix下都是用這個的。
E. 用於高級語言的編譯程序有哪兩種
用於高級語言的編譯程序有兩種:編譯程序和鏈接程序。
以C語言為例,編譯器是cc,可能鏈接程序就是link。
二者作用是不同的,編譯器是把源程序翻譯成符號語言,鏈接程序把來自不同源文件的多個程序整合起來,形成最終的可執行程序。
C++的編譯系統沿用了C語言。其他語種,如PASCAL,DELPHI,C#,OBJECT-C,本質上沒發生變化
高級語言本身分成兩類,編譯型和解釋性的,編譯型的就是上面的類型,解釋型的,如BASIC,JAVA,
PHP,
PYTHON等,是不需要編譯的,可以直接根據源代碼(或中間代碼)直接翻譯到操作系統上。
F. 用cc怎樣把.c文件編譯成.so文件
比如有一個test.c文件,我想打包成動態庫test.so,
直接gcc test.c -o test.o -fPIC
gcc -o test.so test.o -shared
使用的時候發布.so和頭文件即可。
鏈接的時候要記得丟在默認目錄或者將其所在目錄聲明到環境變數,不然有時候會提示找不到這個庫文件。
G. 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下編譯。
H. CC+編程好學嗎
好學不好學看個人的學習水平和個人的具體情況,但是絕對不容易學精,這個我敢保證,如果你沒有好幾年的學習真的只能說是入門,因為這個東西很龐大,當你接觸的時候就知道了,連編譯器都是英文的,出錯了有時候也看不懂是什麼回事。祝你好運!~
I. c語言編譯系統有哪些及其特點
C 語言特點
C語言是一種成功的系統描述語言,用C語言開發的UNIX操作系統就是一個成功的範例;同時C語言又是一種通用的程序設計語言,在國際上廣泛流行。世界上很多著名的計算公司都成功的開發了不同版本的C語言,很多優秀的應用程序也都使用C語言開發的,它是一種很有發展前途的高級程序設計語言。 1. C是中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、位元組和地址進行操作, 而這三者是計算機最基本的工作單元。 2.C是結構式語言。結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C 語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。 3.C語言功能齊全。具有各種各樣的數據類型,並引入了指針概念,可使程序效率更高。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的的游戲。 c語言
4. C語言適用范圍大。適合於多種操作系統,如Windows、DOS、UNIX等等;也適用於多種機型。 C語言對編寫需要硬體進行操作的場合,明顯優於其它解釋型高級語言,有一些大型應用軟體也是用C語言編寫的。 C語言具有較好的可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫。它是數值計算的高級語言。 常用的C語言IDE(集成開發環境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc 等等…… c語言的學習 對於一個初學者,Microsoft Visual C++是一個比較好的軟體。界面友好,功能強大,調試也很方便。這是微軟出的一個C語言集成開發環境(IDE),主要有:VC++6.0、VS2005、VS2008、VS2010等,分為企業版和學生版等。對於初學者VC++6.0是比較容易上手的,但由於其對標准支持的不好可能使人養成不良編程習慣,因此論壇上也有人主張舍棄VC++6.0。 在unix/linux操作系統上,學習c語言一般使用vim/emacx來編輯源文件,使用gcc/cc來編譯源文件,使用make程序來管理編譯過程。
編輯本段發展歷史
c語言
C語言的祖先是BCPL語言。 1967年,劍橋大學的Martin Richards 對CPL語言進行了簡化,於是產生了BCPL(Basic Combined Pogramming Language)語言。 1970年,美國貝爾實驗室的Ken Thompson。以BCPL語言為基礎,設計出很簡單且很接近硬體的B語言(取BCPL的首字母)。並且他用B語言寫了第一個UNIX操作系統。 在1972年,美國貝爾實驗室的D.M.Ritchie在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。 為了使UNIX操作系統推廣,1977年Dennis M.Ritchie 發表了不依賴於具體機器系統的C語言編譯文本《可移植的C語言編譯程序》。 1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。同時由B.W.Kernighan和D.M.Ritchie合著 c語言程序設計
了著名的《The C Programming Language》一書。通常簡稱為《K&R》,也有人稱之為《K&R》標准。但是,在《K&R》中並沒有定義一個完整的標准C語言,後來由美國國家標准化協會(American National Standards Institute)在此基礎上制定了一個C語言標准,於一九八三年發表。通常稱之為ANSI C。 K&R第一版在很多語言細節上也不夠精確,對於pcc這個「參照編譯器」來說,它日益顯得不切實際;K&R甚至沒有很好表達它所要描述的語言,把後續擴展扔到了一邊。最後,C在早期項目中的使用受商業和政府合同支配,它意味著一個認可的正式標準是重要的。因此(在M. D. McIlroy的催促下),ANSI於1983年夏天,在CBEMA的領導下建立了X3J11委員會,目的是產生一個C標准。X3J11在1989年末提出了一個他們的報告[ANSI 89],後來這個標准被ISO接受為ISO/IEC 9899-1990。 1990年,國際標准化組織ISO(International Organization for Standards)接受了89 ANSI C 為I SO C 的標准(ISO9899-1990)。1994年,ISO修訂了C語言的標准。 1995年,ISO對C90做了一些修訂,即「1995基準增補1(ISO/IEC/9899/AMD1:1995)」。1999年,ISO有對C語言標准進行修訂,在基本保留原來C語言特徵的基礎上,針對應該的需要,增加了一些功能,尤其是對C++中的一些功能,命名為ISO/IEC9899:1999。 2001年和2004年先後進行了兩次技術修正。 目前流行的C語言編譯系統大多是以ANSI C為基礎進行開發的,但不同版本的C編譯系統所實現的語言功能和語法規則有略有差別。
J. VC++、C、CC之間有什麼區別
vc++是微軟開發的C++開發工具,主要用於window平台的軟體開發,但是合理的配置也可以編譯linux或者android下的軟體(需要對應的sdk或者gcc編譯器)。針對window應用的開發,其提供了mfc庫,可以提高window應用程序開發的速度和質量。一般應用於網路通信、UI開發、應用軟體、服務軟體等大中型軟體項目開發
C不是C++,雖然一開始是一種面向過程編程的語言,但新的linux內核使用了該語言編程,但是卻是遵循的面向對象的概念。可以進行埠、定址和內存操作,一般應用於內核、驅動、靜態庫、動態庫等小型項目或者系統項目的開發。
CC一般多存在於makefile文件,是一種編譯時的環境變數,往往指向一個C/C++的編譯器,並沒有專門的實體和其對應。