带有子目录的Makefile

时间:2015-10-14 09:49:20

标签: c++ makefile

我正在尝试为C ++项目编写一个makefile,分为以下目录:

  • makefile
  • src - (所有.cpp个文件)
  • include(所有.h个文件)
  • obj(所有.o个文件)
  • bin(在那里创建可执行文件)

我已经阅读了很多关于这个主题但是它太简单了,他们手动列出文件或者太复杂而且我迷路了。

我尝试用许多不同的方式编写makefile,这是最后一个:

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

TARGET = bin/evolveIt

LINKER   = g++ -o
# linking flags here
LFLAGS   = -Wall -I. -lm

# change these to set the proper directories where each files shoould be
SRCDIR   = src
OBJDIR   = obj
HDIR = include
BINDIR   = bin

SOURCES  := $(wildcard $(SRCDIR)/*.cpp)
INCLUDES := $(wildcard $(HDIR)/*.h)
OBJECTS  := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
rm       = rm -f


$(BINDIR)/$(TARGET): $(OBJECTS)
    @$(LINKER) $@ $(LFLAGS) $(OBJECTS)
    @echo "Linking complete!"

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
    @$(CC) $(CFLAGS) -c $< -o $@
    @echo "Compiled "$<" successfully!"

.PHONEY: clean
clean:

但现在我有这个错误:

src/PopulationManager.cpp:4:31: fatal error: PopulationManager.h: No such file or directory
 #include "PopulationManager.h"
                               ^
compilation terminated.
Makefile:28: recipe for target 'obj/PopulationManager.o' failed
make: *** [obj/PopulationManager.o] Error 1

我知道当标题位于不同的目录中时我必须使用-I,但它已经在CFLAGSLFLAGS中,并且它不会改变任何内容如果我把它直接放在INCLUDES这样:

INCLUDES := -I $(wildcard $(HDIR)/*.h)

程序本身没有错误,在我放入不同的目录之前编译好了。这个makefile的目的是避免在我的源文件中编写相对路径,如

include "include/PopulationManager.h"

知道这个makefile有什么问题吗?

0 个答案:

没有答案