我的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
答案 0 :(得分:5)
添加源文件列表:
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) ...
前面必须有一个“制表符”字符,而不是空格。
答案 1 :(得分:1)
您可以使用VPATH
for separating source and object files:
src/myapp.c
obj/Makefile
抓住现有的Makefile
,将其移至obj/
,省略对$(TGT)
和$(SRC)
的引用,并添加以下内容:
VPATH=../src
请注意,如果您尝试multi-architecture builds, VPATH
is not ideal。
CC=g++
CFLAGS=-c -Wall -std=c++11
myapp: myapp.o
$(CC) $(TGT)/myapp.o -o $(TGT)/myapp
myapp.o:
$(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o
你可以改用:
CXXFLAGS=-Wall -std=c++11
CXXFLAGS+=$(INC)
LDLIBS+=-lstdc++
myapp: myapp.o
所以,总结一下,你的新obj/Makefile
应该是这样的:
VPATH=../src
INC=-I../include
CXXFLAGS=-Wall -std=c++11
CXXFLAGS+=$(INC)
LDLIBS+=-lstdc++
myapp: myapp.o
如果需要,您可以从Makefile
创建另一个obj/
以递归到新的all: obj/myapp
obj/myapp:
mklink obj/Makefile ../Makefile
$(MAKE) --directory=obj/
:
{{1}}