預編譯,編譯,彙編操作
-E
進行預編譯操作,生成.i文件,注意,這裏的.c文件是main函數所在的文件
cc -E test.c -o test.i
-S
只進行編譯操作,不進行彙編,生成彙編文件
gcc -S test.i -o test.s
-c
進行彙編操作,把生成的彙編文件轉爲二進制的目標文件
gcc -c test.s -o test.o
鏈接操作
(1)靜態鏈接:
在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。(個人備註:靜態鏈接將鏈接庫的代碼複製到可執行程序中,使得可執行程序體積變大)
(2)動態鏈接:
在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。(個人備註:動態鏈接指的是需要鏈接的代碼放到一個共享對象中,共享對象映射到進程虛地址空間,鏈接程序記錄可執行程序將來需要用的代碼信息,根據這些信息迅速定位相應的代碼片段。可移植性差)
這裏使用到的命令如下:
//這裏的方式是-o後面直接跟目標文件,然後再跟需要的.o文件
gcc -o x x1.o x2.o
實際使用的命令
實際過程中,可以直接忽略具體的執行步驟,只需要輸入和輸出就夠了
gcc -o test file1.c file2.c
常用的gcc的選項
- -O0 -O1 -O2 -O3 譯器的優化選項的4個級別,-O0表示示沒有優化,-O1爲缺省值,-O3優化級別最高高
- -w 不生生成任何警告信息
- -Wall 生成所有警告信息。
- -g 生成調試信息。GNU 調試器可利用用該信息。
- -static 此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大。
- -share 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫