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
添加源文件列表:
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) ...必须有一个"制表符"字符,而不是空格.