1. makefile用来干什么的?
复杂的定义我不知道,只知道它是用来干vc6++一个很骚气的动作(一键编译)。
2. makefile怎么做到vc6++的一键编译呢?
先来看下磁盘中文件的组成,一个test文件夹,test包含了adc led uart 3个文件夹和一个main.cpp 与 makefile文件(.vscode文件夹忽略)。写好程序和makefile文件后,打开shell终端,cd到test文件目录下,然后执行make即可。如下图所示。
3. makefile怎么写呢?
基于2的文件架构,下面是对应的makefile文件。后期如果要增加文件夹,直接在VPATH中加入文件夹路径即可。推荐看GNU make, GCC编译相关知识。
# 指定makefile搜索路径
VPATH = led uart adc
# 是否需要生成GDB调试信息
DEBUG = -g
# 编译警告
WARNNING = -Wall
# 编译器优化等级
OPTIMIZATION = -o1
# 指定编译使用的指令
CC = g++
# 指定编译器头文件搜索目录
INCLUDE = $(foreach n, $(VPATH), -I $(n))
# 编译器使用c++11
STDCPP11 = -std=c++11
# 组合各个编译选项
CFLAGS = $(DEBUG) $(WARNNING) $(OPTIMIZATION) $(STDCPP11) $(INCLUDE)
# 链接动态库
LINKS = -lpthread
# 生成的目标/可执行文件的名称
TARGET = main
# 取出所有makefile当前目录和VPATH指定目录的.cpp文件
FILES = *.cpp $(foreach n, $(VPATH), $(n)/*.cpp)
# 将所有的文件.cpp文件对应成.o文件
OBJS = $(addsuffix .o, $(basename $(wildcard $(FILES))))
# 目标依赖所有的.o文件
$(TARGET):$(OBJS)
$(CC) -o $@ $^ $(LINKS)
# 将所有的.cpp文件编译成对应的.o文件
%.o:%.cpp
$(CC) $(CFLAGS) -c $< -o $@
# make clean时,所有.o文件和目标文件
.PHONY : clean
clean:
rm $(TARGET) $(OBJS)