解决了一个MakeFile的问题

博客指出每次执行make命令会重新编译所有文件,原因是目标文件与源文件不在同一目录,make查找依赖时OBJ不存在而重新编译。给出解决办法,即通过$(BUILD_HOME)/%.o: %.cpp实现将源代码编译到其他目录,解决重复编译问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题所在:

     每次执行make命令,都要重新编译所有的文件。

情况:

   目标文件(.o)与源文件(.cpp)不在同一个目录下面。编译的文件又比较多,所以使用匹配模式来编译,语句如下:.cpp.o: CC $(INCLUDE) -c $< -o $(BUILDHOME)/$@

程序生成:$(TARGET) : $(OBJ)
                       $(CC) $(LIBS) $(ABSOBJ) -o $(BINDIR)/$@

其中$(ABSOBJ)是所有.o文件的真实路径,$(OBJ)是与.cpp文件对应的.o的文件名

TARGET的依赖文件写成OBJ,是想自动匹配:.cpp.o: CC $(INCLUDE) -c $< -o $(BUILDHOME)/$@,生成 ABSOBJ

原因:

  make执行的时候会自动检查目标文件与源文件的日期,如果目标文件比源文件旧或者目标文件不存在则会重新编译目标文件。make命令查找到TARGET依赖OBJ,会去编译OBJ,但是OBJ不存在(因为在前一次执行编译的时候生成的是ABSOBJ),所以make还会匹配:.cpp.o: 重新编译。

解决方法:

之所以采取上述比较怪异的做法,是因为不知道如何批处理的将源代码编译到别的目录,而不是当前目录

事实上可以这样实现:

$(BUILD_HOME)/%.o: %.cpp
        $(CC) -I$(INCLUDES) -c $< -o $@

然后TARGET

呵呵,很简单吧,可是事先就是没想到,初次接触makefile。

感觉自己写的还不是很有条理,反正是随便写写的,暂时也没有时间整理,通过经常这样写写来提高自己的语言表达能力和文字功底吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值