Compiler options
CC=gcc
CXX=g++
CFLAGS=-g -Wall -Wextra -Werror -pedantic-errors
CXXFLAGS=$(CFLAGS)
Project files
SRCDIR=src
INCDIR=include
OBJDIR=obj
LIBDIR=lib
BINDIR=bin
Library files
LIB_NAME=example
LIB_OBJS=$(patsubst
(
S
R
C
D
I
R
)
/
(SRCDIR)/%,
(SRCDIR)/(OBJDIR)/%,$(wildcard
(
S
R
C
D
I
R
)
/
∗
.
c
∗
)
)
L
I
B
T
A
R
G
E
T
=
(SRCDIR)/*.c*)) LIB_TARGET=
(SRCDIR)/∗.c∗))LIBTARGET=(LIBDIR)/lib$(LIB_NAME).a
Executable files
EXEC= ( B I N D I R ) / p r o g r a m S R C = (BINDIR)/program SRC= (BINDIR)/programSRC=(wildcard ( S R C D I R ) / ∗ . c ∗ ) O B J = (SRCDIR)/*.c*) OBJ= (SRCDIR)/∗.c∗)OBJ=(patsubst ( S R C D I R ) / (SRCDIR)/%, (SRCDIR)/(OBJDIR)/%,$(SRC:.c%=.o))
Default target
all: $(EXEC)
Link object files to create executable
$(EXEC): $(OBJ) $(LIB_TARGET)
$(CXX)
(
C
X
X
F
L
A
G
S
)
−
L
(CXXFLAGS) -L
(CXXFLAGS)−L(LIBDIR) -o $@ $^
Compile C and C++ source code to object files
$(OBJDIR)/%.o: $(SRCDIR)/%.c*
@[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
$(CXX)
(
C
X
X
F
L
A
G
S
)
−
I
(CXXFLAGS) -I
(CXXFLAGS)−I(INCDIR) -c $< -o $@
Build and archive library
$(LIB_TARGET): $(LIB_OBJS)
@[ -d $(LIBDIR) ] || mkdir -p $(LIBDIR)
$(AR) rs $@ $^
Clean up object files, library files and executable
clean:
rm -rf $(OBJDIR)/* $(LIB_TARGET) $(EXEC)
基本设置
这与之前的Makefile类似。在设置目标之前,我们需要设置编译器选项以及正在使用的目录和文件。
CC和CXX:定义编译器的名称
定义一些共同的编译器选项CFLAGS和CXXFLAGS
定义我们正在使用的项目文件夹,包括源文件夹,头文件夹,目标文件夹,二进制文件夹和库文件夹。
库文件
这个Makefile支持编译和构建库文件(静态库)的功能。这里定义了库名称,包括在库中的源文件以及将目标代码打包到一个静态库中的方式。
LIB_NAME:指定库的名称
LIB_OBJS:将所有源文件编译为目标文件
LIB_TARGET:将LIB_OBJS的所有目标文件打包到静态库中
可执行文件
这个Makefile也支持生成可执行文件,定义了输入参数和输出参数以及如何将目标文件链接到可执行文件中。
EXEC:指定生成的可执行文件名
SRC:保存源代码文件的名称
OBJ:保存目标文件的名称
目标
我们定义了三个目标:
all:默认目标。编译所有源代码并链接它们以生成可执行文件。
$(EXEC):将所有目标文件和库组合起来生成可执行文件。
$(OBJDIR)/%.o:输入源文件名,输出目标文件
(
L
I
B
T
A
R
G
E
T
)
:输入所有目标文件,输出库文件生成目标
a
l
l
:默认目标。如果输入
m
a
k
e
命令并不指明目标,
m
a
k
e
将执行第一个目标(即
a
l
l
)使用
(LIB_TARGET):输入所有目标文件,输出库文件 生成目标 all:默认目标。如果输入make命令并不指明目标,make将执行第一个目标(即 all)使用
(LIBTARGET):输入所有目标文件,输出库文件生成目标all:默认目标。如果输入make命令并不指明目标,make将执行第一个目标(即all)使用(EXEC)作为目标。
( E X E C ) :告诉 m a k e 应该通过链接生成可执行文件来生成最终目标文件。它使用 (EXEC):告诉make应该通过链接生成可执行文件来生成最终目标文件。 它使用 (EXEC):告诉make应该通过链接生成可执行文件来生成最终目标文件。它使用(CXX),编译器链接已编译的目标文件和库文件,生成可执行文件。
$(OBJDIR)/%.o:Makefile中的模式规则。 它指示Make如何从源文件生成目标文件。 我们使用 $(CXX) 将C C++源文件编译成目标文件。
( L I B T A R G E T ) :它告诉 M a k e 生成库文件,使用 (LIB_TARGET):它告诉Make生成库文件,使用 (LIBTARGET):它告诉Make生成库文件,使用(AR)(archive命令)将多个目标文件打包到一个arc文件中来生成一个静态库文件。
清理
最后,定义了一个clean目标,用于删除所有已生成的目标文件、库文件和可执行文件。
这个Makefile是通用的,适用于大多数C或C++项目。但是,需要根据特定的项目需求进行适当的修改。