7

我的 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

4

2 回答 2

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) ...必须有一个“制表符”字符,而不是空格。

于 2012-10-28T14:55:15.597 回答
1

您可以VPATH用于分离源文件和目标文件

src/myapp.c
obj/Makefile

取你现有的Makefile,将其移入obj/,省略对 and 的引用$(TGT)$(SRC)添加以下内容:

VPATH=../src

请注意,如果您尝试进行多架构构建,VPATH则并不理想


顺便说一句,您没有利用内置规则。你在哪里

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

如有必要,您可以创建另一个Makefileup fromobj/以递归到这个新的:

all: obj/myapp

obj/myapp:
    mklink obj/Makefile ../Makefile
    $(MAKE) --directory=obj/
于 2012-10-28T14:46:19.873 回答