linux 通用makefile編寫

2021-10-24 07:59:33 字數 3450 閱讀 8088

一般當我們的工程檔案較多的時候,使用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...