makefile複習筆記1

2022-09-10 14:42:34 字數 2607 閱讀 9271

原始檔——中間目標檔案——執行檔案。在編譯時,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出乙個警告,但可以生成object file。而在鏈結程式時,鏈結器會在所有的object file中找尋函式的實現,如果找不到,那到就會報鏈結錯誤碼(linker error)。  給中間目標檔案打個包,叫「庫檔案」。

make命令根據  gnumakefile或makefile或

makefile

編譯鏈結。  make的「-f」和「--file」引數指定makefile檔案。找檔案中的第乙個目標檔案(target)。規則:編譯針對沒編譯過的或修改了的檔案。  make會一層又一層地去找檔案的依賴關係。

target可以是乙個object file(目標檔案),也可以是乙個執行檔案,還可以是乙個標籤(label)。

prerequisites就是,要生成那個target所需要的檔案或是目標。

command也就是make需要執行的命令。(任意的shell命令)

一定要以乙個tab鍵作為開頭。也可以在prerequisites加分號後面

變數:obj= file1.o file2.o 使用:$(obj)  好處:方便修改;

隱晦規則(  自動推導命令和檔案):根據test.o自動新增test.c 和cc -c test.c; eg: $(objects) : defs.h;kbd.o command.o files.o : command.h

偽目標檔案:.phony : clean;  「.phony」  避免和檔案重名,表示clean是個偽目標檔案 。-rm中的-代表忽略錯誤繼續執行。 clean從來都是放在檔案的最後。  偽目標也可以指定所依賴的檔案,一口氣生成若干個可執行檔案。  .phony : 可以不寫,但  建議:顯式寫出是乙個好習慣。 

makefile自動生成依賴:.d檔案,gcc -mm main.c——main.o:main.c main.h

靜態模式: 自動化變數「$<」表示所有的依賴目標集,「$@」表示目標集。

: :多目標:  bigoutput littleoutput : text.g

generate text.g -$(subst output,,$@) > $@

makefile裡主要包含了五個東西:顯式規則、隱晦規則、變數定義、檔案指示(1,引用檔案;2,  指定makefile中的有效部分;3, 定義乙個多行的命令)和注釋(#)。

引用:-include foo.make *.mk$(bar)。-表示忽略錯誤繼續執行。尋找:當前目錄—— 「-i」或「--include-dir」引數指定目錄——系統include目錄;先警告、繼續下面的、結束後重新找前面過不去的、還是不行就發出錯誤,-可以忽略錯誤。  在include前面可以有一些空字元,但是絕不能是[tab]鍵開始。 

環境變數makefiles:所有make命令都會引用它(故 一定不要設定這個變數 )。環境變數makefile的「目標」不會起作用,如果環境變數中定義的檔案發現錯誤,make也會不理。

規則包含兩個部分,乙個是依賴關係,乙個是生成目標的方法。第一條規則中的目標將被確立為最終的目標。如果第一條規則中的目標有很多個,那麼,第乙個目標會成為最終的目標。

make步驟:1,讀入所有的makefile。2,讀入被include的其它makefile。3,初始化檔案中的變數。4,推導隱晦規則,並分析所有規則。5,為所有的目標檔案建立依賴關係鏈。6,根據依賴關係,決定哪些目標要重新生成。7,執行生成命令。

萬用字元:「*」,「?」和「~」(使用者主目錄)

makefile檔案搜尋:1,特殊變數:  vpath = src:../headers 2, 「vpath」關鍵字1、vpath :為符合模式的檔案指定搜尋目錄。「%」的意思是匹配零或若干字元2、vpath :清除符合模式的檔案的搜尋目錄。3、vpath :清除所有已被設定好了的檔案搜尋目錄。

「@」字元在命令行前,這個命令將不被make顯示出來 

make執行時,帶入make引數「-n」或「--just-print」,那麼其只是顯示命令,但不會執行命令.  make引數「-s」或「--slient」則是全面禁止命令的顯示. 

命令出錯:1,使用-忽略單個命令錯誤。2,全域性方法:make -i或  --ignore-errors。3,  規則是以「.ignore」作為目標的,那麼這個規則中的所有命令將會忽略錯誤。4,  make的引數的是「-k」或是「--keep-going」則中止此 規則 ,繼續其他規則。

定義命令包:命令序列的語法以「define」開始,以「endef」結束。使用:$(命令包名)。

巢狀執行:cd subdir && $(make)。 總控makefile的變數傳遞到下級的makefile中,但是不會覆蓋下層的makefile中所定義的變數,除非指定了「-e」引數。

(不)向下層makefile傳遞變數variable...:(un)export ;可以向下層傳遞所有變數,只需export就行了

「-w」或是「--print-directory」會在make的過程中輸出一些資訊,讓你看到目前的工作目錄。如 make: entering directory `/home/hchen/gnu/make'.

「-c」引數來指定make下層makefile時,「-w」會被自動開啟的。如果引數中有「-s」(「--slient」)或是「--no-print-directory」,那麼,「-w」總是失效的。

makefile複習筆記3

函式呼叫 思考如何定義乙個 空格 變數 bar subst space comma foo 把 foo 中 space 換成 comma 字串處理函式 subst,patsubst,strip,findstring,filter,filter out,sort,word,wordlist,words...

HTML 複習筆記 1

html格式化 html 樣式 外部樣式表 當瀏覽器讀到乙個樣式表,它就會按照這個樣式表來對文件進行格式化。有以下三種方式來插入樣式表 當樣式需要被應用到很多頁面的時候,外部樣式表將是理想的選擇。使用外部樣式表,你就可以通過更改乙個檔案來改變整個站點的外觀。當單個檔案需要特別樣式時,就可以使用內部樣...

Linux 複習筆記1

1.linux嚴格區分大小寫 2.linux所有內容以檔案形式儲存,包括硬體 3.linux不靠副檔名區分檔案型別 壓縮包 gz,bz2,tar.bz2 tgz等 二進位制軟體包 rpm 指令碼檔案 sh 配置檔案 conf 分割槽每個block大小為4k 1.擁有相同的i節點和儲存block塊,可...