一、 概念介紹:
1. 構建:指定代碼文件的編譯順序和編譯的安排。
2. make:最常用的構建工具,主要用於 c 語言項目。
是一個根據指定的 shell 命令進行構建的工具。
當某個文件發生變化時,就可以用 make 重新構建。
3. Makefile/makefile:make 命令默認依賴的構建文件,可用用 make -f 文件名 或 make --file=文件名 指定爲其它文件。
二、 makefile 文件格式:
makefile 文件由一系列的規則組成,每條規則的形式如下:明確目標構建的前置條件,以及如何構建。
<target>: <prerequisites> 即 <目標>:<前置條件>
[tab] <command> 即 [tab 鍵] <命令>
其中目標是必須的,前置條件和命令必須至少存在一個。
1. 目標(target):一個目標構成一個規則,通常爲文件名,可爲一個或多個,文件名間用空格分隔。
2. 僞目標(phony target):目標爲某個操作的名字。爲了避免操作名與文件名相同,要用 .PHONY: 僞目標名 聲明僞目標。
3. 前置條件(prerequisites):通常爲一組文件名,用空格分隔,指定目標是否進行重新構建的標準。
只要一個前置文件不存在或者更新過,目標就需要重新構建。
4. 命令(command):指定如何更新目標文件,由一行或多行 Shell 命令組成,通常爲生成目標文件。
每行命令前必須有一個 tab 鍵,可通過修改內置變量更改 .RECIPEPREFIX=符號 。
命令的每一行都是單獨在 Shell 中執行的,沒有繼承關係(如變量)。要實現繼承,可以
- 將命令寫在一行,命令間加 ;
- 在命令行尾添加 ; \
- 在 target 上一行聲明 .ONESHELL
三、 示例:
利用 make 管理文章中的示例:https://blog.csdn.net/sinat_40471574/article/details/105253099
寫好頭文件和源文件,組織好項目,之後編寫 makefile 文件,利用 make 工具自動進行編譯,生成可執行文件。
1. 靜態庫實現:
app : app.c libother1.a libother2.a \
include/other1.h include/other2.h
cc app.c -o app -Iinclude -L./ -lother1 -lother2; \
mv other1.o other2.o src;\
mv libother1.a libother2.a lib
other1.o : include/other1.h src/other1.c
cc -c src/other1.c -o other1.o
other2.o : include/other2.h src/other2.c
cc -c src/other2.c -o other2.o
libother1.a : other1.o
ar rcs libother1.a other1.o
libother2.a : other2.o
ar rcs libother2.a other2.o
.PHONY:
clean :
rm -rf src/*.o
.PHONY:
addlib: lib/libother1.a lib/libother2.a
cp lib/libother1.a lib/libother2.a /usr/local/lib
.PHONY:
addinclude:
cp include/other1.h include/other2.h /usr/local/include
2. 動態庫實現:
app : app.c libother.so other1.o other2.o\
include/other1.h include/other2.h
echo "/myCode/c/linux_project/dynamic/lib" >> /etc/ld.so.conf ;\
cc app.c -o app -I include -L./ -lother; \
mv libother.so lib; \
mv other1.o other2.o src;\
ldconfig
other1.o : include/other1.h src/other1.c
cc -fPIC src/other1.c -Iinclude -c
other2.o : include/other2.h src/other2.c
cc -fPIC src/other2.c -Iinclude -c
libother.so : other1.o other2.o
cc -shared -o libother.so *.o
.PHONY:
clean :
rm -rf src/*.o
.PHONY:
addlib: lib/libother1.a lib/libother2.a
cp lib/libother.so /usr/local/lib
.PHONY:
addinclude:
cp include/other1.h include/other2.h /usr/local/include
3. 其它:
make 工具詳細教程:https://www.cnblogs.com/8335IT/p/8143316.html
make 管理工程示例:https://github.com/lueyoung/2019-2020-2-linux-shell/tree/master/makefiles