在寫涉及到子目錄的makefile檔案時,從上面的部落格學習到很多!自己寫的也是仿照著寫的,主要以此部落格的makefile對知識點做乙個 更詳細的說明 和 對makefile做乙個總結!
說明:如有錯誤,敬請見諒!我編譯的是.so庫,很多命令用不到,只是網上搜尋學習了一下!
(1)目錄結構:
(2)主檔案加下的makefile
xx = g++clibs = -l./lib/ -lsender -lreceiver -lresponser -lpthreadar = ar
arflag = -rcs
cflags = -g
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 arflagexport 後跟隨 變數 將其匯出,這些變數在子目錄中的makefile依舊可以使用
#objects = $(patsubst %.cpp,%.o,$(sources))完整命令應該是 $(patsubst %.cpp,%.o,$(wildcard *.cpp))
使用widcard獲取到所有cpp檔案,在將其檔案字尾替換為.o (我個人編譯的是.so庫不需要這些,但我認為應該並不是實際修改檔案,而只是獲得乙個檔案列表,即之後使用g++編譯時的目標)
$(objects) : %.o : %.cpp%.o : %.cpp 將所有.cpp檔案編譯為相應的.o檔案$(xx) -c $(cflags) $< -o $@ $(include_dirs)
實際應該是 main.o : main.cpp 這種形式(這也就是patsubst的用處了,獲取所有的cpp對應.o檔案列表)
$@ 目標,即$(objects)的值
$
$(subdirs):echoecho 沒有特殊用途,只是執行一下命令+$(make) -c $@
+$(make) -c $@ 執行子目錄下的makefile
.phony : clean.phnoy clean是沒有依賴項的,也不會生成clean檔案,如果該資料夾下存在clean檔案,就無法執行clean:下的操作了,就是為了解決這個的clean:
for dir in $(subdirs);\
do $(make) -c $$dir clean||exit 1;\
done
rm -rf $(target) $(objects) ./lib/*.a
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 變數名 值 引用變數可在之後定義 ...