0

我对makefile非常陌生。我之前做过的最复杂的任务是在已经设计好的 makefile 中包含新的 .h 和 .cpp 或 .c。

我必须将项目的编译过程从 Visual Studio 移植到 gcc,并且已经有一个同事为此编写的解决方案,但他使用 4 个 bash 脚本和一个 makefile 来编译解决方案。

我没有这样做,而是在寻找使其更易于维护的解决方案。我承认我的问题可能非常愚蠢,但我无法在任何地方找到它,也无法正确理解它。

在下面的目标中:

$(OBJECTS): %.o: %.cpp 
    $(CC) $(CPPFLAGS) -c $< -o $@

我想测试正在创建的 .o 是否已经存在并将其重命名为其他名称。这是必要的,因为在项目中有几个同名但内容不同的源文件。

例如,如果当前正在编译的 .cpp 名为 file.cpp 并且将生成的对象是 file.o,则该规则应测试 file.o 是否已存在并将当前 file.o 重命名为其他名称。

如果您知道任何解释这一点的好教程,请告诉我。我发现了很多示例,这些示例显示了如何对按该规则编译的当前文件进行测试,但没有一个示例会重命名对象 .o。

在此先感谢您对此处写的任何“愚蠢”表示歉意。:-)

4

2 回答 2

3

首先,我们深表同情。

Make 并没有真正设计来处理这种歧义,所以我们必须使用 kludge。您还没有说出要将文件重命名为 的内容所以现在假设我们file.o移至file_save.o.

# This tells Make that these are not real targets, so that it will
# proceed even if file.o already exists.
.PHONY: $(OBJECTS)

$(OBJECTS): %.o: %.cpp 
    # If file.o exists, move it to file_save.o
    @if [ -f $@ ]; then mv $@ $*_save.o; fi
    $(CC) $(CPPFLAGS) -c $< -o $@
于 2011-04-25T15:37:30.823 回答
1

扩展我对这个问题的评论:

也许您应该考虑将目标文件放在与源文件相同的目录层次结构中,以防止命名冲突。

这样src/network/client.cpp就被编译成build/obj/network/client.o了。

我对makefile非常生疏,但我相信我通过执行以下操作解决了这个问题:

$SRC= src/network/client.cpp src/main.cpp .....
$OBJ= makefile_replace_function($SRC, .o)

$(OBJ) : $(SRC)
   compile_instructions

因为我已经忘记了,所以你将不得不替换它们的真正等价makefile_replace_function物......compile_instructions

我意识到这可能不是很有帮助,但至少它是一个值得考虑的想法。

于 2011-04-27T12:46:22.017 回答