Makefile學習筆記

2021-09-28 14:04:30 字數 3822 閱讀 2573

在寫涉及到子目錄的makefile檔案時,從上面的部落格學習到很多!自己寫的也是仿照著寫的,主要以此部落格的makefile對知識點做乙個 更詳細的說明 和 對makefile做乙個總結!

說明:如有錯誤,敬請見諒!我編譯的是.so庫,很多命令用不到,只是網上搜尋學習了一下!

(1)目錄結構:

(2)主檔案加下的makefile

xx = g++

ar = ar

arflag = -rcs

cflags = -g

clibs = -l./lib/ -lsender -lreceiver -lresponser -lpthread

subdirs = ./receiver ./responser ./sender

includes = $(wildcard ./include/.h ./sender/.h ./receiver/.h ./responser/.h) # include = a.h b.h … can』t be defined like "include = ./.h"

#sources = $(wildcard ./.cpp ./sender/.cpp ./receiver/.cpp ./responser/*.cpp)

include_dirs = -i./include -i./sender/ -i./receiver/ -i./responser/ #指定頭檔案目錄,**中就不需要把頭檔案的完整路徑寫出來了pa

tsub

st(patsubst %.cpp,%.o,

(patsu

bst(sources))

objects = main.o

export xx cflags ar arflag

$(target) : $(objects) $(subdirs)

$(xx) $< -o $@ $(clibs) # $< 表示依賴列表的第乙個 也就是 $(objects)

$(objects) : %.o : %.cpp

$(xx) -c $(cflags) $< -o $@ $(include_dirs)

( su

bdir

s):e

cho+

(subdirs):echo +

(subdi

rs):

echo

+(make) -c $@

echo:

@echo $(subdirs)

@echo begin compile

.phony : clean

clean:

for dir in $(subdirs);

do $(make) -c $$dir clean||exit 1;

done

rm -rf $(target) $(objects) ./lib/*.a

(3)receiver目錄下的makefile**如下:

lib_dir = ./…/lib/

top_dir = ./…

sources = katex parse error: expected 'eof', got '#' at position 32: … style="color: #̲008000;">/*(top_dir)/include -i$(top_dir)/responser/ -i./

target = libreceiver.a

objects = (pa

tsub

st(patsubst %.cpp,%.o,

(patsu

bst(sources))

$(target) : $(objects)

$(ar) $(arflag) $@ $^

cp $@ $(lib_dir)

$(objects) : %.o : %.cpp

$(xx) -c $(cflags) $< -o $@ $(include_dirs)

.phony : clean

clean:

rm -rf $(target) $(objects)

xx = g++
定義變數xx,此後當需要用到g++的時候,可以用$(xx)替代

clibs = -l./lib/ -lsender -lreceiver -lresponser  -lpthread
同樣是定義變數,但對幾點做一下說明

-l./lib/  指明庫的路徑

-lpthread  在預設和指明的庫路徑中尋找libpthread.so(以lib開頭)

includes = $(wildcard ./include/*.h ./sender/*.h ./receiver/*.h ./responser/*.h)
wildcard  函式獲取工作目錄下的.**件列表

*.h  *為萬用字元,  在makefile規則中,萬用字元會被自動展開。但在變數的定義和函式引用時,萬用字元將失效(這還是定義變數)

wildcard  將萬用字元展開,includes獲取的就是這些目錄下的所有.**件

include_dirs = -i./include -i./sender/ -i./receiver/ -i./responser/
-i.include    標頭檔案路徑,在c++**中可以不指定標頭檔案的完整路徑,將在這些目錄下尋找

export xx cflags ar arflag
export 後跟隨 變數 將其匯出,這些變數在子目錄中的makefile依舊可以使用

#objects = $(patsubst %.cpp,%.o,$(sources))
完整命令應該是    $(patsubst %.cpp,%.o,$(wildcard *.cpp))

使用widcard獲取到所有cpp檔案,在將其檔案字尾替換為.o  (我個人編譯的是.so庫不需要這些,但我認為應該並不是實際修改檔案,而只是獲得乙個檔案列表,即之後使用g++編譯時的目標)

$(objects) : %.o : %.cpp 

$(xx) -c $(cflags) $< -o $@ $(include_dirs)

%.o : %.cpp    將所有.cpp檔案編譯為相應的.o檔案  

實際應該是     main.o : main.cpp  這種形式(這也就是patsubst的用處了,獲取所有的cpp對應.o檔案列表)

$@        目標,即$(objects)的值

$

$(subdirs):echo

+$(make) -c $@

echo      沒有特殊用途,只是執行一下命令

+$(make) -c $@  執行子目錄下的makefile

.phony : clean

clean:

for dir in $(subdirs);\

do $(make) -c $$dir clean||exit 1;\

done

rm -rf $(target) $(objects) ./lib/*.a

.phnoy      clean是沒有依賴項的,也不會生成clean檔案,如果該資料夾下存在clean檔案,就無法執行clean:下的操作了,就是為了解決這個的

do $(make) - c $$dir clean || exit 1;    執行子資料夾下的clean命令  (這裡我不是特別懂語法,但是大概也是明白的)

執行到了子資料夾下的makefile,下一步操作類似了,就不在說明了!

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 變數名 值 引用變數可在之後定義 ...