Makefile學習筆記

2021-10-01 21:07:59 字數 2391 閱讀 9651

gcc編譯命令gcc ***.c

該命令實際上是包含了4個過程

1.預編譯

首先需要明確一點,gcc不會儲存預編譯處理階段的輸出檔案,如果要看到預編譯過程,需要使用-e引數,-e只會啟動預編譯

gcc -e ***.c (該命令只會列印預編譯結果到螢幕)假如想將其輸入到檔案中方便檢視和分析,需要使用-o將列印到螢幕的內容輸出到文字檔案中,檔名一般約定熟成為.i當然你也可以使用別的比如a.都是ok的

gcc -e ***.c -o ***.i 或者 gcc -e -o ***.i ***.c

2.編譯

編譯為組合語言的過程也是不會列印出來,因此如果要檢視編譯成彙編檔案的過程需要使用引數-s,該引數只會啟動預編譯與編譯,將原始檔或者預編譯過的檔案編譯為彙編檔案,成成的檔案為.s

1.gcc -s ***.c -o ***.s 或者 gcc -s -o ***.s ***.c 或者 gcc -s ***.c (該方式會自動根據原始檔來命名彙編檔名稱)

2.gcc -s ***.i -o ***.s 或者 gcc -s -o ***.s ***.i 或者 gcc -s ***.i (同上)

3.彙編

-c引數是將原始檔或者預編譯檔案.i或者彙編檔案.s編譯成二進位制目標檔案.obj

1.gcc -c ***.c -o ***.o 或者 gcc -c -o ***.o ***.c 或者 gcc -c ***.c (包含預編譯、編譯和彙編3步,最終自動命名為***.o檔案)

2.gcc -c ***.i -o ***.o 或者 gcc -c -o ***.o ***.i 或者 gcc -c ***.i (包含編譯、彙編)

3.gcc -c ***.s -o ***.o 或者 gcc -c -o ***.o ***.s 或者 gcc -c ***.s (包含彙編)

4.鏈結

不帶引數時,將原始檔或者.i或者彙編檔案或者二進位制目標檔案鏈結為可執行檔案(此時生成的名稱為a.out,但是我們想要改為我們自己想要的檔名稱的話,我們需要使用-o輸出到自定義的檔名中)

1.gcc ***.c -o *** 或者 gcc -o *** ***.c 或者 gcc -o *** ***.c 或者 gcc ***.c (包含了彙編、編譯、彙編和鏈結4個過程)

2.gcc ***.i -o *** 或者 gcc -o *** ***.i 或者 gcc ***.i (包含了編譯、彙編、鏈結3個過程)

3.gcc ***.s -o *** 或者 gcc -o *** ***.s 或者 gcc ***.s (包含了彙編、鏈結2個過程)

3.gcc ***.o -o *** 或者 gcc -o *** ***.o 或者 gcc ***.o (只是鏈結過程)

由於gcc不能將多個檔案使用-e、-s或者-c通過-o輸出到單個檔案中,所以對於多檔案編譯,我們只需要使用第4個過程的命令即可。

gcc a.i b.i -o *** 或者 gcc a.i b.i 或者 gcc -o *** a.i b.i

gcc a.s b.s -o *** 或者 gcc a.s b.s 或者 gcc -o *** a.s b.s

gcc a.o b.o -o *** 或者 gcc a.o b.o 或者 gcc -o *** a.o b.o

gcc a.c b.c -o *** 或者 gcc a.c b.c 或者 gcc -o *** a.c b.c

注:文中的***為可執行目標檔案

為什麼需要makefile?相信許多同學在看linux核心原始碼、u-boot原始碼時,我們需要從makefile這個檔案入手,因為它是編譯過程的管理指令碼,假如沒有makefile,程式設計師的工作會很複雜。

因為makefile實際上就說多個gcc命令的集合,如果我們每編譯乙個原始檔都去gcc一下的話,會很麻煩正對原始檔很多的工程而言。因此makefile就應運而生。

makefile的最簡單的語句結構如下:

target …:dependent files …

command……

target:target是我們的目標,就是我們最終需要得到的東西或者我們想要執行的某個偽目標。至於後面的…也就是我們的目前可以有多個(上**就可以看到了)。

dependent files:是生成目標檔案所需要的依賴檔案,因此我叫它叫做dependent,當然假如是偽目標時,是沒有dependent files的。

command:command是執行的shell命令,gcc命令等。可以是實現生成目標檔案的gcc命令,可以是執行的shell命令,比如rm,ls等.需要注意的是command前面的空格是tab鍵打出來的

eg:test : a.o b.o

gcc -o test a.o b.o

a.o b.o : a.c b.c

gcc -c -o a.o a.c

gcc -c -o b.o b.c

clean :

rm *.o

makefile學習筆記 makefile概述

20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...

Makefile學習筆記

makefile for boot asm nasm 定義變數 asmflags i include run qemu system i386 hdd boot.img boot.img boot.asm asm boot.asm f bin o boot.img install run clean...

Makefile學習筆記

本文為學習筆記,僅供參考,如有好的建議歡迎指出!makefile規則 目標檔案 依賴檔案 tab 命令 命令前必須有乙個tab exp test main.c gcc main.c o test 隱式規則 o c 同名匹配 變數 類似於c中的巨集,引用方式 arg 變數名 值 引用變數可在之後定義 ...