makefile 簡單例項

2021-09-01 19:28:14 字數 3061 閱讀 5711

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...