项目结构
// 现在的文件结构
---+- include -+- tools -+- aaa.h
| | +- bbb.h
| +- ccc.h
+- src -+- tools -+- aaa.c
| +- bbb.c
|
+- main.c
项目文件夹:
- include 放置.h头文件,可以有文件夹层级.
- src 放置源文件.c文件,可以有文件夹层级
- tmp 放置编译生成产物
Makefile
以下makefile用来编译纯c项目.如果要编译c++项目,把gcc改为g++,把.c改为.cpp
特别说明:以下不适用链接库的情况.如果有需要使用静态库或动态库的自行修改.
# linux环境使用
.PHONY: clean test # 伪目标
# 自定义环境变量
CC = gcc # 指定编译器
CSTD = -std=c99 # 指定c标准
CFLAGS = -I include # 指定头文件目录
CFILES = $(wildcard src/*.c src/*/*.c) # 搜索所有的源文件
# 第一种 .o文件与.c 同目录,同层级
# OBJS = $(CFILES:.c=.o) # 所有的目标文件
# 第二种 .o文件与.c 不同目录,同层级
# tmpobj=$(patsubst %.c,%.o,$(CFILES))
# OBJS = $(patsubst src/%,tmp/%,$(tmpobj)) # 所有的目标文件,替换目录到tmp路径下
# 第三种 .o文件与.c 不同目录,不同层级
tmpobj = $(notdir $(CFILES)) # 去除路径信息的源文件
OBJS = $(patsubst %.c,tmp/%.o,$(tmpobj)) # 所有目标文件
TARGET = main # 最终生成目标
RM = -rm -f # 删除方式
all: $(TARGET)
# 项目构建方式
$(TARGET): $(OBJS)
@echo -e -n "\033[35m" #紫色
@echo "build $(TARGET) start"
@echo -e -n "\033[0m" #样式结束
$(CC) -o $(TARGET) $(OBJS)
@echo -e -n "\033[32m" #蓝色
@echo ' ___ _ _ ___ ___ ___ ___ ___ '
@echo ' / __| | | |/ __/ __/ _ \/ __/ __|'
@echo ' \__ \ |_| | (_| (_| __/\__ \__ \'
@echo ' |___/\__,_|\___\___\___||___/___/'
@echo ' '
@echo "build success!"
@echo "see you next time."
@echo -e -n "\033[0m" #样式结束
tmp/%o : src/%c
$(CC) -c $(CFLAGS) $< -o $@ $(CSTD)
tmp/%o : src/*/%c
$(CC) -c $(CFLAGS) $< -o $@ $(CSTD)
clean:
@echo -e "\033[33mclean .o file and binary file.\033[0m"
$(RM) $(OBJS) $(TARGET)
@echo -e -n "\033[35m" #紫色
@echo ' _ '
@echo ' | | '
@echo ' ___| | ___ __ _ _ __ '
@echo ' / __| |/ _ \/ _` | `_ \ '
@echo ' | (__| | __/ (_| | | | |'
@echo ' \___|_|\___|\__,_|_| |_|'
@echo ' '
@echo -e -n "\033[0m" #样式结束
test:
@echo "test command."
@echo "CFILES: $(CFILES)"
@echo "tmpobj: $(tmpobj)"
@echo "OBJS: $(OBJS)"
help:
@echo "make :编译程序"
@echo "make test :测试指令"
@echo "make help :查看帮助信息"
简洁版makefile
去掉字符画
# linux环境使用,简化版
.PHONY: clean test # 伪目标
# 自定义环境变量
CC = gcc # 指定编译器
CSTD = -std=c99 # 指定c标准
CFLAGS = -I include # 指定头文件目录
CFILES = $(wildcard src/*.c src/*/*.c) # 搜索所有的源文件
# 第一种 .o文件与.c 同目录,同层级
# OBJS = $(CFILES:.c=.o) # 所有的目标文件
# 第二种 .o文件与.c 不同目录,同层级
tmpobj=$(patsubst %.c,%.o,$(CFILES))
OBJS = $(patsubst src/%,tmp/%,$(tmpobj)) # 所有的目标文件,替换目录到tmp路径下
# 第三种 .o文件与.c 不同目录,不同层级
#tmpobj = $(notdir $(CFILES)) # 去除路径信息的源文件
#OBJS = $(patsubst %.c,tmp/%.o,$(tmpobj)) # 所有目标文件
TARGET = main # 最终生成目标
RM = -rm -f # 删除方式
# 项目构建方式
$(TARGET): $(OBJS)
$(CC) -o $(TARGET) $(OBJS)
tmp/%o : src/%c
$(CC) -c $(CFLAGS) $< -o $@ $(CSTD)
clean:
$(RM) $(OBJS) $(TARGET)
# 这两个命令可有可无
test:
@echo "test command."
@echo "CFILES: $(CFILES)"
@echo "tmpobj: $(tmpobj)"
@echo "OBJS: $(OBJS)"
help:
@echo "make :编译程序"
@echo "make test :测试指令"
@echo "make help :查看帮助信息"
使用效果展示
make clean
make
运行编译后程序