常用Makefile改进版

Makefile改进,自动遍历指定目录下所有c文件,无需在Makefile中手动添加…
Makefile详细解析,请参考Makefile学习

以下面文件结构为例,说明Makefile

  • 文件结构
eric@eric-PC:~/Documents/work/linux-c/http(副本)$ tree
.
├── libmbedtls
│   ├── libmbedcrypto.a
│   ├── libmbedtls.a
│   └── libmbedx509.a
├── Makefile
└── src
    ├── httpclient
    │   ├── httpclient.c
    │   └── httpclient.h
    ├── json
    │   ├── cJSON.c
    │   └── cJSON.h
    └── main.c

4 directories, 9 files

  • Makefile文件
######################################
# eric
######################################

## 指定编译工具
CC	= gcc
CPP	= g++
RM	= rm -rf

## 源文件路径(默认检索3层)
SRC_PATH	:= ./src
DIRS	:= $(shell find $(SRC_PATH) -maxdepth 3 -type d)

## 目标文件名称
TARGET	:= main

## 获取所有.c文件路径
SRCS	+= $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
SRCPPS	+= $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))

## 所有对应目标文件
OBJS	:= $(SRCS:.c=.o) $(SRCPPS:.cpp=.o)

## 所有用到的库
LIBS	:= pthread m mbedtls mbedcrypto mbedx509

## 指定头文件路径
INCLUDE_PATH	:= . $(DIRS)

## 指定库文件路径
LIB_PATH	:= /lib ./libmbedtls

## 编译参数初始化
CFLAGS		:= -g -O3 #-Wall

## 加载头文件路径
CFLAGS		+= $(foreach dir, $(INCLUDE_PATH), -I$(dir))
CFLAGS 		+=  `pkg-config --cflags --libs opencv` 

## 加载库文件路径
LDFLAGS		+= $(foreach libdir, $(LIB_PATH), -L$(libdir))

## 加载库文件
LDFLAGS 	+= $(foreach lib, $(LIBS), -l$(lib))


.PHONY:all
all: $(TARGET) 
 
$(TARGET) :$(OBJS)
	@$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
	@#$(RM) $(OBJS)
	@echo =============================
	@echo $(TARGET) ok

%.o	: %.c
	@echo $@...
	@$(CC) -c $(CFLAGS) $< -o $@
	
%.o	: %.cpp
	@echo $@...
	@$(CPP) -c $(CFLAGS) $< -o $@ 
	
# %.o	: %.S
#     $(CC) -c $(CFLAGS) $< -o $@
 
.PHONY:clean
clean:
	$(RM) $(OBJS) $(TARGET)
  • make && make clean
eric@eric-PC:~/Documents/work/linux-c/http(副本)$ make clean
rm -rf ./src/main.o ./src/json/cJSON.o ./src/httpclient/httpclient.o main 
eric@eric-PC:~/Documents/work/linux-c/http(副本)$ make
src/main.o...
src/json/cJSON.o...
src/httpclient/httpclient.o...
=============================
main ok
eric@eric-PC:~/Documents/work/linux-c/http(副本)$ tree
.
├── libmbedtls
│   ├── libmbedcrypto.a
│   ├── libmbedtls.a
│   └── libmbedx509.a
├── main
├── Makefile
└── src
    ├── httpclient
    │   ├── httpclient.c
    │   ├── httpclient.h
    │   └── httpclient.o
    ├── json
    │   ├── cJSON.c
    │   ├── cJSON.h
    │   └── cJSON.o
    ├── main.c
    └── main.o

4 directories, 13 files

仅此记录

猜你喜欢

转载自blog.csdn.net/pyt1234567890/article/details/109329761