【问题标题】:Using makefiles to identify and reduce coupling使用 makefile 识别和减少耦合
【发布时间】:2014-12-25 05:19:52
【问题描述】:

对于一个可以从重构中受益的大型项目,我的目标之一是减少耦合。我在这里将耦合视为将代码分解为非常小的/逻辑编译单元的能力,就像This document 3.1 中解释的耦合一样。

所以我正在编写一个 makefile 来单独测试源文件。 目的是所有目标文件都编译到.object/ 目录。这个想法是,当这些大型源文件无法组装时,我发现了一个需要注意的地方。

问题是 makefile 每次都编译每个源,我找不到导致它的规则。

在使用这样的 makefile 时,我的方法错了吗?有没有更好的方法来进行这种重构 - 除了使用带有这些内置工具的 IDE 吗?

CC       = g++
CC_FLAGS = -std=c++0x -pthread
LI_FLAGS = 
EXEC     = UAVapp.o
OUT      = .object/

#Types/
T = Arming.hpp JCommand.hpp
TYPES  = $(T:%=Types/%)

#Extensions
HPP     = Defines.hpp $(TYPES)
CPP     = 

#Groups
COBJ    = $(CPP:.cpp=.o)
HOBJ    = $(HPP:.hpp=.o) 

all: PRE $(EXEC)

# Main target
$(EXEC): $(HOBJ)
    touch $(EXEC)
#$(CC) $(LI_FLAGS) $(CC_FLAGS) $(OUT)$(COBJ) -o $(EXEC)


%.o:%.hpp
    $(CC) -c $< $(CC_FLAGS) -o $(OUT)$(notdir $@)
%.o:%.cpp 
    $(CC) -c $< $(CC_FLAGS) -o $(OUT)$(notdir $@)

# Do work before compilation
PRE:
    @mkdir -p $(OUT)
clean:
    rm -rf ./*.o $(EXEC) ./$(OUT)*

【问题讨论】:

  • 你的目标文件不应该依赖于头文件(你为什么还要编译头文件?),源文件应该。
  • 不!不!不!宏,宏!请不要再使用宏了!
  • 是的,如果我没有说清楚它需要大量重构,.hpp 文件中充满了代码。如果我不是一次通过这些资源来处理事情,我会使用更通用的方法。

标签: c++ makefile decoupling


【解决方案1】:

粗略看来,您的问题似乎是您的“%.o:%.hpp”和“%o:%.cpp”规则实际上并没有生成左侧列出的文件。通常 make 通过检查左侧列出的文件并确定它是否比作为其依赖项列出的文件更新来确定没有工作要做,但是由于左侧的文件永远不会因为规则,必须始终执行规则。尝试在左侧指定“.object/foo.o”,而不是劫持内置规则(我也强烈建议不要破坏 Make 提供的诸如“CC”之类的命令)。

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多