gcc/g++參數以及使用

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   動態鏈接庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章