使用MinGW下的makefile编译所有CPP文件

eme*_*esx 7 c++ mingw makefile gnu-make

我的C++项目的目录结构是

/..
   makefile     <- the makefile is in root
   /include     <- subdirectory that has to be included while compiling
   /obj         <- target place for all *.o and final executable
   /src         <- sources
Run Code Online (Sandbox Code Playgroud)

我目前的makefile是:

CC=g++
CFLAGS=-c -Wall -std=c++11

INC=-Iinclude
SRC=src
TGT=obj

all: myapp

myapp: myapp.o
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp

myapp.o:
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o

clean:
    rm -rf $(TGT)
    mkdir $(TGT)
Run Code Online (Sandbox Code Playgroud)

这适用于我的第一个文件.我是一个总的makefile新手 - 请帮我编译目录下的所有文件/src,并将它们链接到/obj目录中的可执行文件.

makefile必须在Windows下工作,我使用的是MinGW和MSYS

Ola*_*che 5

添加源文件列表:

SOURCES = $(wildcard $(SRC)/*.cpp)
Run Code Online (Sandbox Code Playgroud)

以及相应目标文件的列表:

OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))
Run Code Online (Sandbox Code Playgroud)

和目标可执行文件:

$(TGT)/myapp: $(OBJS)
    $(CXX) $(LDFLAGS) $(OBJS) -o $@
Run Code Online (Sandbox Code Playgroud)

构建对象的规则:

$(TGT)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)

现在你必须指定g ++的选项:

INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
Run Code Online (Sandbox Code Playgroud)

一切都在一起:

SRC=src
TGT=obj
INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
SOURCES = $(wildcard $(SRC)/*.cpp)
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))

$(TGT)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(TGT)/myapp: $(OBJS)
    $(CXX) $(LDFLAGS) $(OBJS) -o $@
Run Code Online (Sandbox Code Playgroud)

重要的是,$(CXX) ...必须有一个"制表符"字符,而不是空格.