在終端中輸入 gcc 檔名 -o 目標檔名然後 ./目標檔名 就行了,沒有目標檔名,自動存為 a執行 ./a 就行了。在使用Gcc編譯器的時候,我們必須給出一系列必要的呼叫引數和檔名稱。GCC編譯器的呼叫引數大約有100多個,其中多數引數我們可能根本就用不到,這裡只介紹其中最基本、最常用的引數。 GCC最基本的用法是∶gcc [options] [filenames] 其中options就是編譯器所需要的引數,filenames給出相關的檔名稱。 -c,只編譯,不連線成為可執行檔案,編譯器只是由輸入的.c等原始碼檔案生成.o為字尾的目標檔案,通常用於編譯不包含主程式的子程式檔案。 -o output_filename,確定輸出檔案的名稱為output_filename,同時這個名稱不能和原始檔同名。如果不給出這個選項,gcc就給出預設的可執行檔案a.out。 -g,產生符號除錯工具(GNU的gdb)所必要的符號資訊,要想對原始碼進行除錯,我們就必須加入這個選項。 -O,對程式進行最佳化編譯、連線,採用這個選項,整個原始碼會在編譯、連線過程中進行最佳化處理,這樣產生的可執行檔案的執行效率可以提高,但是,編譯、連線的速度就相應地要慢一些。 -O2,比-O更好的最佳化編譯、連線,當然整個編譯、連線過程會更慢。 -Idirname,將dirname所指出的目錄加入到程式標頭檔案目錄列表中,是在預編譯過程中使用的引數。C程式中的標頭檔案包含兩種情況∶ A)#include <myinc.h> B)#include “myinc.h” 其中,A類使用尖括號(< >),B類使用雙引號(“ ”)。對於A類,預處理程式cpp在系統預設包含檔案目錄(如/usr/include)中搜尋相應的檔案,而B類,預處理程式在目標檔案的資料夾內搜尋相應檔案。 GCC執行過程示例 示例程式碼 a.c: #include <stdio.h> int main() { printf("hello\n"); } 預編譯過程: 這個過程處理宏定義和include,並做語法檢查。 可以看到預編譯後,程式碼從5行擴充套件到了910行。 gcc -E a.c -o a.i cat a.c | wc -l 5 cat a.i | wc -l 910 編譯過程: 這個階段,生成彙編程式碼。 gcc -S a.i -o a.s cat a.s | wc -l 59 彙編過程: 這個階段,生成目的碼。 此過程生成ELF格式的目的碼。 gcc -c a.s -o a.o file a.o a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped 連結過程: 連結過程。生成可執行程式碼。連結分為兩種,一種是靜態連結,另外一種是動態連結。使用靜態連結的好處是,依賴的動態連結庫較少,對動態連結庫的版本不會很敏感,具有較好的相容性;缺點是生成的程式比較大。使用動態連結的好處是,生成的程式比較小,佔用較少的記憶體。 gcc a.o -o a 程式執行: ./a hello編輯本段GCC編譯簡單例子 編寫如下程式碼: #include <stdio.h> int main() { printf("hello,world!\n"); } 執行情況如下: gcc -E hello.c -o hello.i gcc -S hello.i -o hello.s gcc -c hello.s -o hello.o gcc hello.c -o hello ./hello hello,world!
在終端中輸入 gcc 檔名 -o 目標檔名然後 ./目標檔名 就行了,沒有目標檔名,自動存為 a執行 ./a 就行了。在使用Gcc編譯器的時候,我們必須給出一系列必要的呼叫引數和檔名稱。GCC編譯器的呼叫引數大約有100多個,其中多數引數我們可能根本就用不到,這裡只介紹其中最基本、最常用的引數。 GCC最基本的用法是∶gcc [options] [filenames] 其中options就是編譯器所需要的引數,filenames給出相關的檔名稱。 -c,只編譯,不連線成為可執行檔案,編譯器只是由輸入的.c等原始碼檔案生成.o為字尾的目標檔案,通常用於編譯不包含主程式的子程式檔案。 -o output_filename,確定輸出檔案的名稱為output_filename,同時這個名稱不能和原始檔同名。如果不給出這個選項,gcc就給出預設的可執行檔案a.out。 -g,產生符號除錯工具(GNU的gdb)所必要的符號資訊,要想對原始碼進行除錯,我們就必須加入這個選項。 -O,對程式進行最佳化編譯、連線,採用這個選項,整個原始碼會在編譯、連線過程中進行最佳化處理,這樣產生的可執行檔案的執行效率可以提高,但是,編譯、連線的速度就相應地要慢一些。 -O2,比-O更好的最佳化編譯、連線,當然整個編譯、連線過程會更慢。 -Idirname,將dirname所指出的目錄加入到程式標頭檔案目錄列表中,是在預編譯過程中使用的引數。C程式中的標頭檔案包含兩種情況∶ A)#include <myinc.h> B)#include “myinc.h” 其中,A類使用尖括號(< >),B類使用雙引號(“ ”)。對於A類,預處理程式cpp在系統預設包含檔案目錄(如/usr/include)中搜尋相應的檔案,而B類,預處理程式在目標檔案的資料夾內搜尋相應檔案。 GCC執行過程示例 示例程式碼 a.c: #include <stdio.h> int main() { printf("hello\n"); } 預編譯過程: 這個過程處理宏定義和include,並做語法檢查。 可以看到預編譯後,程式碼從5行擴充套件到了910行。 gcc -E a.c -o a.i cat a.c | wc -l 5 cat a.i | wc -l 910 編譯過程: 這個階段,生成彙編程式碼。 gcc -S a.i -o a.s cat a.s | wc -l 59 彙編過程: 這個階段,生成目的碼。 此過程生成ELF格式的目的碼。 gcc -c a.s -o a.o file a.o a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped 連結過程: 連結過程。生成可執行程式碼。連結分為兩種,一種是靜態連結,另外一種是動態連結。使用靜態連結的好處是,依賴的動態連結庫較少,對動態連結庫的版本不會很敏感,具有較好的相容性;缺點是生成的程式比較大。使用動態連結的好處是,生成的程式比較小,佔用較少的記憶體。 gcc a.o -o a 程式執行: ./a hello編輯本段GCC編譯簡單例子 編寫如下程式碼: #include <stdio.h> int main() { printf("hello,world!\n"); } 執行情況如下: gcc -E hello.c -o hello.i gcc -S hello.i -o hello.s gcc -c hello.s -o hello.o gcc hello.c -o hello ./hello hello,world!