linux 通用makefile编写

一般当我们的工程文件较多的时候,使用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) -E
AR      = 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)))
 
# 包含所有含有.h文件的目录
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) obj
 
cleanall :
	rm -rf $(OBJS) $(DEPS) obj $(TARGET)

这里补充说明

wildcard函数,就是获取指定的文件
patsubst函数,有替换功能。
$(Files),取File变量的值。
$@ 目标文件
$^ 全部依赖
$< 第一个依赖
$? 第一个变化的依赖

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值