1 gcc的編譯流程
gcc編譯的整個過程并且整個過程下來的每個過程。并且給出了每個階段產物和gcc命令。
1.1 數據段合并
其實就是因為“塊” 一次是讀多個字節而不是一個字節,所以會將一些地址段合并從而提升效率
1.2 地址回填
這張圖也有些問題,正確的結論是:
地址回填發生在編譯器后端生成匯編/機器碼時,屬于 .c → .o
過程中的代碼生成步驟
地址回填:其實就是在最后的鏈接過程中將main函數的真實地址更改掉
以下為一個示例,其他過程同理。
gcc -c test.c -o test.0
鏈接命令 -o可以指定輸出的文件名
gcc [目標文件列表] [庫選項] -o 輸出可執行文件名
gcc main.o utils.o -o app
2 gcc的常用命令
2.1linux中c++函數常用的一種寫法,可以用來給main函數傳遞參數
int main(int argc, char *argv[])
{printf("argc = %d\n", argc);return 0;
}
argc 是 參數的個數(argument count),包括程序名本身。
argv 不是“統計字符”,而是一個 字符串指針數組(argument vector),每個元素是一個 C 字符串(
char *
),指向一個 以空字符\0
結尾的參數。argv[0]
→ 程序名或啟動路徑argv[1]
→ 第一個用戶參數argv[argc]
→ 固定為NULL
,作為哨兵。
分隔規則
默認由shell按**空白字符(空格、Tab、換行)**切分。
如果參數本身含空格,用引號(單或雙)或反斜杠
\
轉義即可保持為一個整體。
./hello one "two words" three
argc = 4
argv 內容為
argv[0] = "./hello" argv[1] = "one" argv[2] = "two words" argv[3] = "three" argv[4] = NULL
2.2 gcc指定頭文件目錄
當頭文件和源文件不在同一個目錄時候可以用以下命令
其中頭文件在./inc 文件夾下
gcc -I./inc hello.c -o hello