參考:gcc參數詳解 gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工做的時候,總共須要4步html
1.預處理,生成.i的文件[預處理器cpp]。 對應的參數是 -E 2.將預處理後的文件不轉換成彙編語言,生成文件.s[編譯器egcs]。對應的參數是 -S 3.有彙編變爲目標代碼(機器代碼)生成.o的文件[彙編器as]。對應的參數是 -c 4.鏈接目標代碼,生成可執行程序[連接器ld]。無參數。linux
有三個文件f1.h、f1.cc、test.cc 內容分別爲: f1.hios
<!-- lang: cpp --> void f1();
f1.ccc++
<!-- lang: cpp --> #include <iostream> #include "f1.h" using namespace std; void f1() { cout << "f1()" << endl; }
test.ccshell
<!-- lang: cpp --> #include <iostream> #include "f1.h" using namespace std; int main() { f1(); cout << "hello" << endl; }
編譯連接過程以下:windows
<!-- lang: shell --> [root@VM-127-178 gcc_test]# ls f1.cc f1.h test.cc [root@VM-127-178 gcc_test]# g++ -S f1.cc [root@VM-127-178 gcc_test]# g++ -S test.cc [root@VM-127-178 gcc_test]# ls f1.cc f1.h f1.s test.cc test.s [root@VM-127-178 gcc_test]# g++ -c f1.s [root@VM-127-178 gcc_test]# g++ -c test.s [root@VM-127-178 gcc_test]# ls f1.cc f1.h f1.o f1.s test.cc test.o test.s [root@VM-127-178 gcc_test]# g++ f1.o test.o [root@VM-127-178 gcc_test]# ls a.out f1.cc f1.h f1.o f1.s test.cc test.o test.s [root@VM-127-178 gcc_test]# ./a.out f1() hello [root@VM-127-178 gcc_test]#
固然,gcc很聰明,能夠一個命令編譯多個文件。如:編輯器
<!-- lang: shell --> g++ -c f1.s test.s
同時支持通配符。能夠這樣: <!-- lang: shell --> g++ -o test *.cc函數
-E 只激活預處理,這個不生成文件,你須要把它重定向到一個輸出文件裏面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一個hello word 也要與處理成800行的代碼 -S 只激活預處理和編譯,就是指把文件編譯成爲彙編代碼。 例子用法 gcc -S hello.c 他將生成.s的彙編代碼,你能夠用文本編輯器察看 -c 只激活預處理,編譯,和彙編,也就是他只把程序作成obj文件 例子用法: gcc -c hello.c 他將生成.o的obj文件 -o 制定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out,很難聽,若是你和我有同感 ,改掉它,哈哈 例子用法 gcc -o hello.exe hello.c (哦,windows用習慣了) gcc -o hello.asm -S hello.c -l 須要連接的庫名稱。即連接庫文件去掉lib前綴和.so後的部分。如libev.so就是 -lev;libace.so就是 -lace。 -L 連接庫文件的搜索路徑。 默認連接庫的搜索路徑爲/lib和/usr/lib。 實際的搜索路徑能夠參見本博客的文章ldconfig , ldd 與 LD_LIBRARY_PATH 之間的關係 若安裝了新的開發包須要配置系統的連接配置。詳見 -I include頭文件的搜索路徑。 當有此選項時,優先搜索此路徑下的頭文件。而後按照#include後面是""仍是<>來決定是優先在當前目錄搜索仍是優先在系統目錄搜索。 默認頭文件的路徑爲當前目錄./ 和系統目錄 /usr/include /usr/local/include。 -g 增長調試信息。 -O0 -O1 -O2 -O3 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1爲缺省值,-O3優化級別最高。 -imacros file 將file文件的宏,擴展到gcc/g++的輸入文件,宏定義自己並不出如今輸入文件中 -Dmacro 至關於C語言中的#define macro -Dmacro=defn 至關於C語言中的#define macro=defn -Umacro 至關於C語言中的#undef macro -undef 取消對任何非標準宏的定義優化
-w 不生成任何警告信息。 -Wall 生成全部警告信息。spa
-static 此選項將禁止使用動態庫,因此,編譯出來的東西,通常都很大,也不須要什麼動態鏈接庫,就能夠運行. -shared 編譯成動態連接庫。一般用在創建共享庫時。 須要配合參數-fPIC使用。
某個程序在運行中要調用某個動態連接庫函數的時候,操做系統首先會查看全部正在運行的程序,看在內存裏是否已有此庫函數的拷貝了。若是有,則讓其共享那一個拷貝;只有沒有才連接載入。在程序運行的時候,被調用的動態連接庫函數被安置在內存的某個地方,全部調用它的程序將指向這個代碼段。所以,這些代碼必須使用相對地址,而不是絕對地址。在編譯的時候,咱們須要告訴編譯器,這些對象文件是用來作動態連接庫的,因此要用地址不無關代碼(Position Independent Code (PIC))。注意:linux下進行鏈接的缺省操做是首先鏈接動態庫,也就是說,若是同時存在靜態和動態庫,不特別指定的話,將與動態庫相鏈接。轉自gcc的靜態庫和動態庫