c文件的執行
c源文件到可執行一共需要經歷4個階段。使用gcc編譯程序要經過預處理、編譯、彙編、鏈接。
預處理
編譯器主要加載頭文件、條件編譯、宏替換,使用:
gcc -E main.c > main.i,
編譯
編譯過程中,編譯器主要做語法檢查和詞法分析,沒有問題之後將會翻譯成彙編代碼或者中間代碼:
gcc -S main.i -o main.s
彙編
彙編階段將main.s文件轉化爲二進制目標代碼
gcc -c main.s -o main.o
鏈接
編譯成功之後,進入鏈接,將目標文件、啓動代碼、庫文件鏈接成可執行文件的過程
gcc main.o -o main.exe
gcc與g++
gcc與g++都是GUN的c&c++的編譯器但是他們有以下區別:
- 後綴.c,gcc當作c程序,g++當作c++程序;後綴爲cpp,gcc與g++都當作c++程序,雖然C++是c的超集,但是語法要求還是有區別的
- 編譯階段,對於c++程序,gcc與g++都可以,不過gcc不能自動完成C++程序與使用庫聯接,通常使用g++,通常使用g++編譯,g++會調用c++,其實差不多
gcc 命令常用選項的功能:
- gcc main.c :執行預處理、彙編、編譯、聯接形成可執行文件,未指定輸出文件名默認a.out
- -x language filename:可以指定語言`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp',比如 gcc -x c main.mm,後綴隨便
- -x none filename:關掉上一個選項,讓gcc根據文件後綴識別文件類型,比如:gcc -x c main.mm -x none main2.c
- -c : 激活預處理、編譯、彙編生成obj文件
- -S :激活預處理和編譯,生成彙編代碼
- -E : 激活預處理,不生成文件,自己可以重定向到輸出文件 gcc -E main.c > main.i
- -o :指定目標名稱,鏈接
- -ldir :使用#include"file" 時,gcc/g++默認在當前目錄查找後文件,可以使用ldir執行目錄
- -l :取消前一個參數的功能,一般用在-ldir後
- -g :只是編譯器,在編譯的時候,產生調試信息,使用參數-g才能使用gdb調試程序
- -static 鏈接靜態庫,禁止使用動態庫
- -shared 進行動態庫鏈接
- lname 鏈接靜態庫(libname.a)或動態庫(libname.so)的庫文件
- -fPIC(或fpic) 生成使用相對地址無關的目標代碼
- -ltest 引用動態庫
C/C++各種後綴
源文件後綴
.c C源程序;預處理,編譯,彙編
.C C++源程序;預處理,編譯,彙編
.cc C++ 源程序;預處理,編譯,彙編
.cxx C++源程序;預處理,編譯,彙編
.m Objective-C源程序;預處理,編譯,彙編
.i 預處理後的C文件;編譯,彙編
.ii 預處理後的C++ 文件;編譯,彙編
.s 彙編語言源程序;彙編
.S 彙編語言源程序;預處理,彙編
.h 預處理器文件;通常不出現在命令行上
其他後綴名的文件被傳遞給連接器(linker).通常包括:
.o 目標文件(Object file)
.a 靜態鏈接庫
.so 動態鏈接庫