3 複雜專案 makefile 編寫
[變數定義和初始化] # 可選
目標: [依賴項]
指令目標: [依賴項]
指令... ...
注:指令可以是編譯指令或其它可以在命令列執行的指令。定義變數後就可以在「目標-依賴-指令」中訪問 $(var_name)
檔案結構:
檔案內容:
main.c
#include
extern
intaddint
(int
,int);
extern
float
addfloat
(float
,float);
intmain
(int argc,
char
** argv)
return0;
}
addint.c
int
addint
(int a,
int b)
addfloat.c
int
addfloat
(float a,
float b)
vpath=.
target=test
$(target): main.o addint.o addfloat.o
gcc $^ -o$@
%.o: %.c
gcc -c $^ -o$@
.phony: clean
clean:
rm -rf *.o $(target)
vpath=.
target=test
slib=libadd.so
$(target): main.o $(slib)
gcc $< -o$@ -ladd -l.
$(slib): addfloat.o addint.o
gcc -fpic -shared -o$@ $^
%.o: %.c
gcc -c $^ -o$@
.phony: clean
clean:
rm -rf *.o $(target) $(slib)
vpath=.
alib=libadd.a
$(target): main.o $(alib)
gcc $^ -o$@
$(alib): addfloat.o addint.o
ar -rcs $@ $^
%.o: %.c
gcc -c $^ -o$@
.phony: clean
clean:
rm -rf *.o $(target) $(alib)
當專案檔案很複雜時,不會把所有的檔案都放在根目錄下面,而是劃分子目錄分別存放。比如:
其中,my_lib 目錄中的檔案用於生成庫,最終的程式以動態庫或靜態庫鏈結的方式進行鏈結,將生成的程式放在 bin下。
inc_dir=include
src_dir=src
obj_dir=obj
bin_dir=bin
# lib專案的檔案目錄
lib_dir=my_lib/lib # 生成的庫的庫路徑
inc_dir_2=my_lib/include
obj_dir_2=my_lib/obj
src_dir_2=my_lib/src
obj=$(patsubst %.c, $(obj_dir)/%.o, $(notdir $(src))) # 生成對應的目標檔案集
src_2=$(wildcard $(src_dir_2)/*.c)
obj_2=$(patsubst %.c, $(obj_dir_2)/%.o, $(notdir $(src_2)))
alib=$(lib_dir)/libadd.a
slib=$(lib_dir)/libadd.so
#用於檢視變數的值
# test: $(src)
# @echo $(src)
# @echo $(obj)
# @echo $(bin_target)
# @echo $(alib)
# @echo $(slib)
# @echo $(src_2)
# @echo $(obj_2)
target=main
bin_target=$(bin_dir)/$(target)
cflags=-i$(inc_dir) -i$(inc_dir_2) -fpic
all: $(obj_dir) $(bin_dir) $(lib_dir) $(bin_target)
$(bin_target):$(obj) $(alib) $(slib)
gcc $(cflags) $< -o$@ -ladd -l$(lib_dir)
$(obj_dir)/%.o:$(src_dir)/%.c
gcc $(cflags) -c $< -o$@
$(obj_dir_2)/%.o:$(src_dir_2)/%.c
gcc $(cflags) -c $< -o$@
$(alib): $(obj_2)
ar -rcs $@ $^
$(slib): $(obj_2)
gcc $(cflags) -shared -o$@ $^
$(obj_dir):
mkdir -p $(obj_dir)
$(bin_dir):
mkdir -p $(bin_dir)
$(lib_dir):
mkdir -p $(lib_dir)
mkdir -p $(obj_dir_2)
.phony: clean
clean:
rm -rf $(bin_target) $(obj) $(obj_2) $(alib) $(slib)
手動建立makefile簡單例項解析
假設我們有乙個程式由5個檔案組成,源 如下 main.c include mytool1.h include mytool2.h int main mytool1.c include mytool1.h include void mytool1 print char print str mytool...
工程Makefile例項
1級makefil phony clean for subdir in subdirs do cd subdir make clean done 級makefile target lib notdir curdir a objs wildcard o cc flags fpic md 靜態庫合成動態...
Makefile例項分析
目錄 makefile如下 arch x86 ifeq arch x86 cc gcc else cc arm linux gnueabihf gcc endif target build dir build src dir src module inc dir include cflags pat...