繁体   English   中英

Make和C ++文件,“包含”在cpp中

[英]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 有什么更好的方法吗?

  1. 如果您需要一个目录才能继续进行,只需输入

     mkdir -p ${DIRECTORY} 

    在规则中需要它之前。 如果该目录已经存在,则mkdir -p将不执行任何操作。

    同样,如果你使用rm -f FILE ,它不应该抱怨,如果FILE没有在第一时间存在。

  2. 没有一种可移植的方式来创建一个变量来保存目录中所有文件的名称。 但是无论如何,您已经在使用GNU Make功能,因此您可以使用

     SOURCES = $(wildcard ${SRCDIR}/*.cpp) 

    接着

     OBJECTS = $(SOURCES:.cpp=.o) 

    将它们转换为目标文件名。 我想您可能还希望替换前导目录名称。

  3. 您没有在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM