一般當我們的工程檔案較多的時候,使用gcc工具直接敲編譯命令比較麻煩,所以寫makefile的好處就來了,每次只需要敲一下make就能編譯
這裡分享乙個萬能版的,當前目錄不管多少檔案,都只需要make一下,不用修改makefile,直接生成main可執行程式
以下是makefile
#交叉編譯工具鏈
#cc=arm-linux-gnueabihf-gcc
cc=gcc
#鏈結庫
cflags=-lm -lpthread
#獲取c檔案
srcfiles=
$(wildcard *.c)
#使用替換函式獲取.o檔案
objs= $ (patsubst %.c,%.o,$(srcfiles)
) all:main
main:$(objs)
$(cc)
-o $@ $^ $(cflags)
%.o:%.c
$(cc)
-c $<
$(cflags)
.phony:clean all
clean:
rm -rf $(objs)
rm -rf main
參考網友的工程目錄帶子目錄的makefile
#交叉編譯工具路徑
cross_compile= /opt/poky/1.7.3/sysroots/x86_64-pokysdk-linux/usr/bin/arm-linux-gnueabihf-
cc =
$(cross_compile)
arm-linux-androideabi-gcc
as = as
ld = ld
#cc = gcc
cpp =
$(cc)
-ear = ar
nm = nm
# 程式的預設名稱
target = main
# 命令列中使用p=x或p=x修改預設程式名稱
ifeq (
"$(origin p)
", "command line"
)target =
$(p)
endif
ifeq (
"$(origin p)
", "command line"
)target =
$(p)
endif
dirs =
$(shell find
. -type d)
# 找出所有的.c .h .a .so檔案及目錄
cfiles_dir =
$(shell find
. -type f -name "*.c"
)cfiles =
$(notdir $(cfiles_dir))
hfiles_dir =
$(shell find
. -type f -name "*.h"
)hfiles =
$(notdir $(hfiles_dir)
)hdirs =
$(sort
$(dir $(hfiles_dir)))
afiles_dir =
$(shell find
. -type f -name "lib*.a"
)afiles =
$(notdir $(afiles_dir)
)adirs =
$(sort
$(dir $(afiles_dir)))
sofiles_dir =
$(shell find
. -type f -name "lib*.so"
)sofiles =
$(notdir $(sofiles_dir)
)sodirs =
$(sort
$(dir $(sofiles_dir)
))# 包含所有含有.**件的目錄
includes +=
$(hdirs:%=-i%)
$(warning includes :
[$(includes) ])
cflags +=
$(includes)
# 編譯標誌
cflags += -wall -werror
cflags += -g -md -o2 -static
# 含有.a .so檔案的目錄
ldflags +=
$(adirs:%=-l%)
ldflags +=
$(sodirs:%=-l%)
# 引用庫檔案
ldflags +=
$(afiles:lib%.a=-l%)
ldflags +=
$(sofiles:lib%.so=-l%)
ldflags += -lpthread
$(warning ldflags :
[$(ldflags) ])
# 包含所有的目錄
vpath =
$(dirs)
# 所有的.c檔案
sources =
$(cfiles)
$(warning sources :
[$(sources) ])
# 目標及依賴
objs =
$(sources:%.c=obj/%.o)
deps =
$(sources:%.c=obj/%.d)
.phony : all clean cleanall
all :
$(target)
$(target)
:$(objs)
@echo
@echo "linking..."
@echo
$(cc)
$(ldflags)
$^ -o $@
@echo
@echo "enjoy < $(target)
> good luck."
@echo
obj/%.o : %.c
@mkdir -p obj
$(cc)
-c $< -o $@
$(cflags)
clean :
rm -rf $(objs)
$(deps)
objcleanall :
rm -rf $(objs)
$(deps)
obj $(target)
這裡補充說明
wildcard函式,就是獲取指定的檔案
patsubst函式,有替換功能。
$(files),取file變數的值。
$@ 目標檔案
$^ 全部依賴
$< 第乙個依賴
$? 第乙個變化的依賴
Linux開發 Makefile基礎和通用模板
目錄前言 c語言編譯過程 gcc命令 debug巨集定義快捷方法 makefile makefile多檔案通用格式 cat etc release 檢視系統版本資訊 更新原始檔 sudo gedit etc apt sources.list 安裝ssh命令 sudo apt get install ...
通用Makefile詳解
我們在linux環境下開發程式,少不了要自己編寫makefile,乙個稍微大一些的工程下面都會包含很多。c的源文 件。如果我們用gcc去乙個乙個編譯每乙個原始檔的話,效率會低很多,但是如果我們可以寫乙個makefile,那麼只需要執行乙個make就ok了,這 樣大大提高了開發效率。但是makefil...
驅動通用Makefile分析
先看makefile 這種需要在核心的makefile中新增arch 和 cross compile ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 kern ver 3.13.0 32 ge...