[英]Make and c++ files, “includes” in the cpp
这是我当前的makefile:
# Compiler #
CXX = g++
DEBUG = -g
LFLAGS =
CXXFLAGS = -Wall
# Directories #
SRCDIR = src/
INCDIR = include/
BUILDDIR = build/
BINDIR = bin/
# Objects #
OBJ_NAMES = main.o dfa.o dfaException.o state.o
OBJS = $(addprefix $(BUILDDIR), $(OBJ_NAMES))
# Output #
NAME = pract3
TARGET = $(BINDIR)pract3
# Clean #
ifeq ($(OS),Windows_NT)
RM = del /q /s $(BUILDDIR:/=\)*.o $(BINDIR:/=\)$(NAME)*
else
RM = rm -rf $(BUILDDIR)*.o $(TARGET)*
endif
# Files #
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LFLAGS) $(OBJS) -o $(TARGET)
$(BUILDDIR)%.o: $(SRCDIR)%.cpp
$(CXX) $(CXXFLAGS) $(LFLAGS) -c $< -o $@
clean:
$(RM)
这是我的项目树:
Porject/
bin/
build/
doc/
...
include/
connection.hpp
dfa.hpp
dfaException.hpp
state.hpp
src/
dfa.cpp
dfaException.cpp
main.cpp
state.cpp
Makefile
Readme
现在,我遇到了三个“问题”。
首先,我希望我的makefile创建bin并构建目录,以防万一。 我想我只需要使用:
mkdir $(BUILDDIR)
mkdir $(BINDIR)
但是我应该放在哪里? 而且,如何防止mkdir和rm(或Windows中的del)消息,例如“无法找到...”或“ x目录已存在...”
其次,我猜我可以从src /中读取对象名称(将.cpp转换为.o),但是如何从目录中读取文件名呢?
最后,我有一个模板类: connection.hpp
(所有函数都在标头中)。 该文件包含在state.hpp
使用: #include "../include/connection.hpp"
。 我跑make
一次用正确的,然后我特意做语法错误connection.hpp
。 然后我再次运行make
,但是它只使用.o
文件编译了目标文件,没有任何错误。 每次我想编辑connection.hpp
,都必须使用make clean
然后make
。 有什么更好的方法吗?
如果您需要一个目录才能继续进行,只需输入
mkdir -p ${DIRECTORY}
在规则中需要它之前。 如果该目录已经存在,则mkdir -p
将不执行任何操作。
同样,如果你使用rm -f FILE
,它不应该抱怨,如果FILE
没有在第一时间存在。
没有一种可移植的方式来创建一个变量来保存目录中所有文件的名称。 但是无论如何,您已经在使用GNU Make功能,因此您可以使用
SOURCES = $(wildcard ${SRCDIR}/*.cpp)
接着
OBJECTS = $(SOURCES:.cpp=.o)
将它们转换为目标文件名。 我想您可能还希望替换前导目录名称。
您没有在make文件中列出任何*.hpp
文件作为先决条件。 您可以手动添加它们,例如
foo.o: foo.cpp bar.hpp baz.hpp
但这很快变得不愉快。 另一个技巧是使用编译器告诉您文件的头(包含) #include
d。 如果您使用的是GCC,则可以运行
gcc -MM foo.cpp
使其在make-file片段上方输出。 您可以像下面这样放置一个模式规则
%.deps: %.cpp ${CXX} -MM ${CPPFLAGS} $< > $@
放入制作文件,然后include
生成的*.deps
文件。
include $(SOURCES:.cpp=.deps)
GNU Make将足够聪明,可以首先解析make文件,认识到*.deps
文件不存在,因此不能include
d,但要弄清楚有一个生成规则。 因此它将执行该规则,然后继续解析生成文件。
我从彼得·米勒(Peter Miller)的精彩文章《 递归使被认为有害》中学到了这一技巧,如果您想学习如何编写优质的make-file,则是一本好书。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.