如何在makefile中动态重命名对象文件

时间:2011-04-25 14:32:29

标签: makefile gnu-make multiple-makefiles

我是非常非常新的makefiles。我以前做过的最复杂的任务是在已设计的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。

提前致谢并抱歉这里写的任何“愚蠢”。 : - )

2 个答案:

答案 0 :(得分:1)

首先,你们深表同情。

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 $@

答案 1 :(得分:1)

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

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

这样就可以将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_functioncompile_instructions替换为真正的等价物......

我意识到这可能不是很有帮助,但至少要考虑它。