如何在更改生成文件标志时强制重新编译
how to force recompile when changing Makefile flags?
我正在编译一些带有依赖项的项目,所以我不必每次都重新编译,但是当我将 -Dsome_flags 添加到我的 CFLAGS 时,它不会重新编译。
dep: $(CPPS)
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
我添加到我的 CFLAS -DDEBUG_FLAG 它迫使我做清洁和制作而不是制造。
它不会重新编译,因为您没有将生成文件本身列为依赖项。
dep: $(CPPS) Makefile
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
也就是说,如果你从命令行输入 make 标志(例如 CFLAGS=-O3 make all
),make
无法检测到您已经更改了这些内容并强制进行完整构建。
在我看来,最简单的方法是先做一个make clean
,然后做一个make
。 当然,这是假设您希望由于编译器标志的更改而重新编译所有源文件。 但是你似乎不喜欢这种方法。
可以将生成文件的名称添加到用于编译源文件的每个规则中,例如:
somefile.o : somefile.cpp <makefile_name>
$(CC) -c $(CFLAGS) somefile.cpp -o somefile.o
或
%.o : %.c <makefile_name>
$(CC) -c $(CFLAGS) somefile.cpp -o somefile.o
考虑到项目的规模和涉及的规则数量,做一个make clean; make
可能是最简单、最快的方法。 但是,一如既往,你里程我的不同。
只是我价值 0.02 美元,希望对您有所帮助T.
Makefile 根据它拥有的数据查找更改。生成文件声明唯一的依赖项在 $(CPPS) 下定义。
dep: $(CPPS)
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
因此,make仅在给定列表中跟踪更改,即$(CPPS)。所以解决方案是:
dep: $(CPPS) Makefile
$(CC) $(CFLAGS) $(INC) -M $(CPPS) > dep
对于完整但不复杂的示例,这是我的helloworld程序的Makefile:
OBJS = helloworld.o
default: hw
%.o: %.c Makefile
gcc -c $< -o $@
hw: $(OBJS)
gcc $(OBJS) -o $@
clean:
-rm -f $(OBJS) hw
每次我更改我的制作文件时,它都会重新编译! :)
相关文章:
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- 如何编译:Mac上的Synergy(2017年的新工具链)
- 如何编译和运行一个新的 C++ Actor 框架项目?
- C++编译新的警告过滤器
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- 如何创建指向派生类的新指针,该派生类在C++编译时未知
- 如何在不退出和失去断点的情况下重新加载重新编译的二进制文件
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- C++运算符新重载、编译错误
- 在新OSX上编译旧碳应用
- 代码块在尝试编译或创建新文件时出现"An assertion failed!"错误
- 在新的Visual Studio项目中包含任何Eigen 3.3.1文件将无法编译
- RCpp:如何在不重新启动R的情况下重新加载重新编译的C++代码
- 新安装的MinGW问题与编译和可执行文件
- 重新编译二进制类或派生类,以便在基类中添加新方法
- 添加新库以编译任何术语.如何编辑生成文件
- C++,如果其他新文件出现问题,使用g++进行编译可以很好地工作
- 每次添加新的源子文件夹时,Cmake都会重新编译所有内容
- 不完整类型的新内容在包装在模板中时编译
- 使用新的 Qt5 信号/插槽机制连接 QTcpSocket::error() 时编译错误