一個c/c++文件要經過預處理、編譯、匯編和鏈接才能變成可執行文件。
鏈接就是將上步生成的OBJ文件和系統庫的OBJ文件、庫文件鏈接起來，最終生成了可以在特定平台運行的可執行文件。
上面一連串命令比較麻煩，gcc會對.c文件默認進行預處理操作，使用-c再來指明了編譯、匯編，從而得到.o文件, 再將.o文件進行鏈接，得到可執行應用程序。簡化如下：
前面編譯出來的可執行文件比源代碼大了很多，這是什麼原因呢？
我們從鏈接過程來分析，鏈接將匯編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來，crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o這些都是gcc加入的系統標準啟動文件，它們的加入使最後出來的可執行文件相原來大了很多。
會提示因為沒有鏈接系統標準啟動文件和標準庫文件，而鏈接失敗。
一般應用程序才需要系統標準啟動文件和標準庫文件。 裸機/bootloader、linux內核等程序不需要啟動文件、標準庫文件。
動態鏈接使用動態鏈接庫進行鏈接，生成的程序在執行的時候需要加載所需的動態庫才能運行。
動態鏈接生成的程序體積較小，但是必須依賴所需的動態庫，否則無法執行。
不過靜態鏈接生成的程序體積較大。
我們可以把整個內存想象成一串連續格子，每個格子(字節)都可以放入一個數據，如下圖所示。
3）.最後：xxx.o和yyy.o鏈接在一起得到一個test應用程序。
對於這些源文件，我們應該分別處理，執行：預處理 編譯 匯編 ，先分別編譯它們，最後再把它們鏈接在一次，比如：
比如：上面的例子，當我們修改a.c之後,a.c會重現編譯然後再把它們鏈接在一起就可以了。，b.c 就不需要重新編譯。
它需要先生成a.o, 發現a.o依賴a.c(執行我們修改了a.c)發現a.c比a.o更加新，就會執行gcc -c -o a.o a.c命令來生成a.o文件。b.o依賴b.c，發現b.c並沒有修改，就不會執行gcc -c -o b.o b.c來重新生成b.o文件。現在a.o b.o都有了，其中的a.o比test更加新，就會執行gcc -o test a.o b.o來重新鏈接得到test可執行程序。所以當執行make命令時候就會執行下面兩條執行：
a.c文件修改了，重新編譯生成a.o, b.c修改了重新編譯生成b.o，a.o, b.o都更新了重新鏈接生成test可執行程序，makefile的規則其實還是比較簡單的。
之前編譯的程序002_syntax，有個缺陷，將其複製出來，新建一個003_example文件夾，放在裡面。 在c.c裡面，包含一個頭文件c.h，在c.h裡面定義一個宏，把這個宏打印出來。