生成文件 - 使用修改后的头文件重建
Makefile - rebuild with modified header files
在我的项目中,我有一些包含方法的头文件(例如模板类)。所有这些头文件都包含在单个文件header.h
中,然后包含在每个cpp文件中。这样,我必须在一个地方更改代码。还有一些.h
文件没有相应的.cpp
file.
然后我有这个制作文件:
# Makefile
.PHONY: run clean rebuild
CC = g++
CFLAGS = -Wall -Ofast -std=c++0x -pthread
RM = rm -f
EXEC = main
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)
$(EXEC): $(OBJ)
$(CC) $(CFLAGS) -o $@ $(OBJ)
%.o: %.cpp
$(CC) $(CFLAGS) -c $^
run: $(EXEC)
./$(EXEC)
clean:
$(RM) $(EXEC) *.o *.gch *~
rebuild: clean $(EXEC)
一切都很好,除了一个小但烦人的细节:如果我修改一个 cpp 文件,那么我可以做make
并且一切都正确更新,但是如果我修改头文件,那么我必须删除所有内容并从头开始重新编译(这就是我有那个丑陋rebuild
目标的原因), 否则,编辑将不起作用。
有没有办法在不重组整个代码的情况下让事情变得更好?
编辑
我尝试过这个制作文件
.PHONY: run clean rebuild
CC = g++
CFLAGS = -Wall -Ofast -std=c++0x -pthread
RM = rm -f
EXEC = main
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)
$(EXEC): $(OBJ)
$(CC) $(CFLAGS) -o $@ $(OBJ)
%.o: %.cpp headers.h
$(CC) $(CFLAGS) -c $<
run: $(EXEC)
./$(EXEC)
clean:
$(RM) $(EXEC) *.o *.gch *.d *~
rebuild: clean $(EXEC)
但结果不是我想要的:如果我修改单个头文件和 do make
,它会告诉我目标是最新的,而我希望它被重新编译。
假设你有 foo.cpp
,其中包含以下行:
#include "bar.h"
您的通用规则:
%.o: %.cpp
$(CC) $(CFLAGS) -c $^
不会在修改bar.h
(并且需要foo.o
)时重建foo.o
。如果您有针对foo.o
的附加规则,它将起作用:
%.o: %.cpp
$(CC) $(CFLAGS) -c $< # note the change of automatic variable
foo.o: bar.h
手动编写这样的规则会很痛苦,但 g++ 会为你做到这一点:
%.o: %.cpp
$(CC) $(CFLAGS) -c -MMD $<
此命令将生成文件foo.d
(作为构建foo.o
的副作用),其中包含以下行:
foo.o: bar.h
将这一行放在一个单独的文件中对您有什么好处?你可以用一行(在makefile的末尾)将其拉到makefile中,如下所示:
-include *.d
(如果这种方法看起来非常简单,那是因为很多聪明人花了很多心思。
不是 Makefile 专家,请看一下这个。有多种解决方案使用 -MM
、-MD
和 -MF
gcc 标志。得票最高的答案建议如下:
depend: .depend
.depend: $(SRCS)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ -MF ./.depend;
include .depend
据我了解,这应该为您生成正确的依赖项,这似乎是正确的方法。但是,我从未使用过它,我会尝试在依赖项中添加头文件(为%.o
附加一个新目标):
%.o: %.cpp %.h header.h
$(CC) $(CFLAGS) -c $<
请注意,我已将$^
更改为$<
,以便仅获取第一个依赖项(即 cpp),并且我附加了header.h
以在此更改时强制重新编译。最后一个可能不是必需的,具体取决于您在那里执行的操作,并且将导致编译效率低下,因为更改它将重新编译所有.o
文件
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 什么文件可以修改 atom 的C++语法?
- 修改生成文件以简化框架 #include 路径
- Windows std::fstream 修改文件后打开()?
- Chilkat SFTP 文件修改时间不与上传更新
- 如何在 Windows 上的 C++ 中根据文件的修改时间读取目录中的文件
- 如何使用Winforms C#或C++.Net在不更改文件中其他内容的情况下修改jpg文件中的Orientation e
- 如何修改Lambda表达式以将输出放入文本文件
- 修改 XML 文件 QXMLStreamReader/Writer
- 如何从 avi 文件中抓取所有帧 - 如何修改 MS 样本采集卡样本
- accept(..) 似乎正在修改我给它的文件描述符参数
- 将头文件和相关修改添加到生成文件
- 在没有root权限的情况下安装NTL,并在生成文件中修改其构建路径
- 如何使用c 在Windows中使用更改日记帐查找文件修改
- 使用生成文件修改项目组织
- 以非管理员身份在 Windows 上的 C 中检查上次文件修改时间
- 在C++中设置文件修改时间的可移植方法
- 使用stat api获取不正确的文件修改时间