我是非常非常新的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。
提前致谢并抱歉这里写的任何“愚蠢”。 : - )
答案 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_function
和compile_instructions
替换为真正的等价物......
我意识到这可能不是很有帮助,但至少要考虑它。