mkefile編寫記錄

2021-09-25 01:07:29 字數 3258 閱讀 5594

檢視的文件:

基礎知識:

arm-linux工具:gcc是一套交叉編譯工具鏈,支援分布編譯,反彙編,可用於,輸出預處理後的c++源程式,生成二進位制目標檔案,生成靜態庫,生成可執行程式,轉換檔案格式,

gcc:編譯的前端程式,用於間原始檔變異成目標檔案,as彙編器(將組合語言轉換為elf),ld聯結器(鏈結定位檔案中的**區,資料區,bss區,棧區,可重新定位目標模組鏈結成乙個單一的,絕對定位的目標程式),ar庫管理器,可將多個重定位目標模組歸檔為乙個函式庫檔案,工程管理器make,objcopy目標檔案格式轉換工具。

編譯:將原始檔.c生成.o檔案,編譯時檢查語法是否爭取 ,函式變數是否正確,告訴編譯器標頭檔案所在的位置每乙個原始檔對應乙個中間目標檔案,

make的工作過程,make會在當前目錄下面找到makefile檔案,找到第乙個目標檔案,如果目標不存在或者依賴的.o檔案修改檔案比目標新,那麼它會指令命令生成目標檔案,如果目標檔案所依賴的.o檔案存在,那麼make會在當前檔案中找到目標為.o檔案的依賴性,如果找不到根據規則規則生成.o檔案

一:makefile的規則

target ... : prerequisites ...

command

target 是乙個偽目標檔案,可以是object檔案,也可以是執行檔案,

prerequisites 生成目標所需的檔案

command所執行的命令

prerequisites 中有檔案比target要新時,command命令將被執行。

eg:gfx_dir := $(pwd)/uvc

gfx_src := $(wildcard $(gfx_dir)/*.c)

mvs_src += $(gfx_src)

mvs_obj := $(mvs_src:%.c=%.o)

all: $(target)

mpi_libs := $(rel_lib)/libmpi.a

mpi_libs += $(rel_lib)/libhdmi.a

$(target):%:%.o $(comm_obj) $(mvs_obj)

$(cc) $(cflags) -lpthread -lm -o $@ $^ $(mpi_libs) $(audio_liba) $(jpegd_liba)

注意:前面加tab空格鍵

依賴關係說明目標檔案由那些庫檔案生成。目標檔案依賴於冒號後面的.o檔案,每個.o檔案依賴後面的.c和.**件。

$^代表所有的可以依賴的檔案

$@代表所有的目標檔案

$《代表第乙個依賴檔案

鏈結依賴檔案的是中間目標檔案.o,這樣我們會少些乙個依賴關係,得到的.o檔案不完整,從而導致變異失敗,為了makefile的易維護我們使用常亮:mvs_obj ,定義的常亮表示所有的.o檔案

二:makefile的萬用字元

乙個大型的makefile總是以萬用字元來配置環境變數,並且,萬用字元就是乙個定義的預設的公式。

1:wildcard用法:$(wildcard patt)在makefile中,他被認為已近是存在的,使用空格分開的,匹配此模式的所有檔案列表

$(wildcard *.c)來獲取工程目錄下的所有.c檔案列表,objects := $(patsubst %.c,%.o,$(wildcard *.c))

此模式採用wildcard 獲得工作目錄下的.c檔案,之後將列表中的所有目錄下的.c替換為.o檔案,這樣我們就可以得到當前目錄下生成的.o檔案列表

用法一:gfx_dir := $(pwd)/uvc

gfx_src := $(wildcard $(gfx_dir)/*.c)

用法二:

objects := $(patsubst %.c,%.o,$(wildcard *.c))

foo : $(objects)

cc -o foo $(objects)

2:notdir:作用:把展開的檔案去除掉路徑資訊。(將路徑下的檔案都去除掉)。

3:patsubst 替換萬用字元

簡單歷程

src=$(wildcard *.c ./sub/*.c)

dir=$(notdir $(src))

obj=$(patsubst %.c,%.o,$(dir) )

all:

@echo $(src)

@echo $(dir)

@echo $(obj)

最後將所有目錄下的.c檔案輸出為.o檔案,而不管路徑資訊。

4:替換規則使用:使用obj=$(dir:%.c=%.o)具有同樣的效果。

mvs_obj := $(mvs_src:%.c=%.o)將目錄下的以及子目錄下的所有.c檔案轉換為.o檔案

這裡採用的是makefile裡的替換引用規則,用你指定的變數替換為另乙個變數。標準格式

$(var:a=b)或者$它的含義就是把變數var中的值結尾有b替換為a。

5:makefile的賦值

=:基本的賦值, :=覆蓋之前的值  ?=如果沒有被賦值就賦值等號後面的值  +=新增等號後面的值

6:命令選項列表

-c將輸入如的原始檔變異成目標檔案, -s將c檔案編譯成彙編檔案  -o file 將輸出內容存於檔案file中  -pipe 在編譯的不同階段採用管道通訊方式 -v 列印出編譯過程中執行的命令  -s 說明檔案輸入型別 -ansi 支援所有的ansi的c程式  -w關閉所有警告 -g檔案中產生除錯資訊 -o0不優化(優化選項等級) -e 執行c的預處理器   -wa  option 將選項option傳遞給彙編器 -i 針對有效的標頭檔案搜尋路徑

三:makefile的一些基本引數:

local_cflags+ =-d***,相當於原始檔加乙個巨集定義 #define ***

./sh中$@指令碼中的所有引數,$#指令碼中的引數的個數

eg:for arg in 「$@」   do    done

/bin/bash  告訴系統其後路徑所指的程式即是解釋此指令碼的shell程式。 後面跟引數,

makefile的環境設定:cflags 指定標頭檔案(.h的路勁)eg;cflags  =-i/usr/include,同樣的安裝乙個包時,會在安裝路勁下建立乙個include目錄,把安裝包的iclude目錄加入到該變數中。cxxflags用於編譯器的選項

ldflags:gcc編譯器會用到的一些優化引數,可以指定庫檔案的位置,用法:ldflags=-l/usr/lib每乙個安裝包會在安裝目錄下建立乙個lib目錄,需要將包中的lib加入到ldfalgs中,

libs:告訴聯結器需要連線那些庫檔案。

oracle 編寫記錄

記錄型別是把邏輯相關的資料作為乙個單元儲存起來,它必須包括至少乙個標量型或record 資料型別的成員,稱作pl sql record 的域 field 其作用是存放互不相同但邏輯相關的資訊。定義記錄型別語法如下 type record type is record field1 type1 not...

Dockerfile編寫記錄

dockerfile 近期幫朋友製作了docker映象以方便使用,在製作的過程中經歷了相容問題,映象size臃腫,映象內多服務問題,下面開始碼例項。from euleros workdir opt add opencv 4.1.0.tar.gz opt run rpm rpmbuilddb yum ...

Makefile編寫記錄

近期學習 linux 需要使用 makefile,網上蒐羅了很多這方面的資料,所裡在這裡做乙個整理。1 靜態模式 看乙個例子 objects foo.o bar.o all objects objects o c cc c cflags o 上面的例子中,指明了我們的目標從 object 中獲取,o...