我正在尝试为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
,但它已经在CFLAGS
和LFLAGS
中,并且它不会改变任何内容如果我把它直接放在INCLUDES
这样:
INCLUDES := -I $(wildcard $(HDIR)/*.h)
程序本身没有错误,在我放入不同的目录之前编译好了。这个makefile的目的是避免在我的源文件中编写相对路径,如
include "include/PopulationManager.h"
知道这个makefile有什么问题吗?