二、編譯和鏈接

1. 源代碼(hello.c)
#include <stdio.h>

int main()
{
  printf("hello world!\n");
  return 0;
}

2. 預編譯過程

$ gcc -E hello.c -o hello.i

預編譯過程包含如下幾個關鍵步驟

  • #define定義的宏全部刪除,并且展開所有的宏定義
  • 處理所有條件編譯指令#if 、#ifdef、#elif、#else、#endif
  • 處理#inlcude預編譯指令,將被包含的文件插入到該預編譯的位置,這個過程可能是遞歸的
  • 刪除所有的///* */
  • 添加行號和文件名標識,以便編譯器編譯或者調試的時候能輸出行號信息
  • 保留所有編譯器相關的指令

我們可以通過hello.i文件,判斷代碼里定義的宏是否正確被展開

3. 編譯過程

$ gcc -S hello.c -o hello.s

hello.s 是匯編代碼

4. 匯編過程

$ gcc -c hello.s -o hello.o

hello.o 是目標文件,ELF格式

5. 鏈接過程

ld命令可以完成鏈接過程


$gcc hello.c -o hello 包含了以上編譯和鏈接的過程,直接生成了可執(zhí)行文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容