我的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
我当前的 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)
这适用于我的第一个文件。我是一个完全的 makefile 新手 - 请帮我编译 /src
目录下的所有文件,并将它们链接到 /obj
目录中的可执行文件。
makefile 必须在 Windows 下工作,我使用的是 MinGW 和 MSYS
最佳答案
添加源文件列表:
SOURCES = $(wildcard $(SRC)/*.cpp)
和相应目标文件的列表:
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))
和目标可执行文件:
$(TGT)/myapp: $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@
构建对象的规则:
$(TGT)/%.o: $(SRC)/%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
现在您必须指定 g++ 的选项:
INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
一切都在一起:
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 $@
重要的是,在 $(CXX) ...
前面必须有一个“制表符”,而不是空格。
关于c++ - MinGW下使用makefile编译所有CPP文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109718/