更改C 中的.h文件不需要再次编译
Changed .h file in C++ does not need to be compiled again?
我有以下问题。成功编译后,如果我在一个.h文件中仅更改某些内容后再次编译,计算机说:
make:``all''无需完成。
即使我只修改了.h文件,我也可以强迫编译器再次编译吗?
如果您希望在更改标题时更新输出,则必须将其添加到依赖项语句中:
myprogram: myprogram.cpp myprogam.h
c++ -o myprogram myprogram.cpp
通常我们不这样做,因为执行事物的代码停留在CPP文件中。如果您在UNIX上并想强制重建,请触摸CPP文件以更新其时间戳(强迫重建),例如,使用" touch myProgram.cpp",或删除您现有的可执行文件。
如果您在没有makefile的情况下使用Make,请推断依赖项,则可能不会推断标题依赖性。在这种情况下,要么吹走您的可执行文件或触摸源文件。
听起来您的makefile没有正确配置的依赖项。这就是您应该考虑修复的方法。
如果您真的想强迫重建而不是解决基本问题。然后,您可以在make all
之前执行make clean
,或者,如果MakeFile没有"干净"目标,请删除所有生成的对象文件和LIBS/operutables,然后再次运行make all
。
您可以使用--always-make
命令行选项强制make
重建所有内容。
但是,听起来您没有正确设置依赖关系。如果您的代码(.cpp文件)实际上包括标题,则通常您的编译目标的目标应在其包含的标头文件上具有先决条件。
有一种比接受答案更简单的方法。只需在makefile中将-MD
添加到编译器标志中,而在makefile末尾将-include myfile.d
添加(将所有源文件列出了所有源文件,而是使用a *.d扩展名)。这将分别将构建文件夹中的附加 *.d依赖关系文件(无论 *.O文件何时何地)在make
时,因此您无需明确地将每个标头文件添加到makefile依赖项中。p>这对于带有大量标头文件的项目很有用。此外,通过这种方式,您知道您不会忘记在makefile依赖项中包含标头文件,从而防止当您认为更改标头文件时二进制更新时丢失故障排除时间,但实际上并没有因为您忘记了将其放在makefile中。
例如,使用gcc -MD -I. -c myfile.cpp -o obj/myfile.o
,您可以将makefile依赖关系保持为foo: myfile.cpp
,而无需myfile.h
。
做到这一点的快捷方式,因此您只需要列出所有文件,就是以下内容:
# Beginning of Makefile etc. etc.
# Only need to list all files once, right here.
SRCS = myfile.cpp myfile2.cpp
OBJS = $(SRCS:%.cpp=%.o)
# put .o and .d files in ./obj/
# (Assumes 'obj' directory exists)
FULLOBJS = $(addprefix obj/,$(OBJS))
# rule to make object (*.o) files
$(FULLOBJS): obj/%.o:%.cpp
gcc -MD -I. -c %< -o $@
# rule to make binary
foo: $(FULLOBJS)
g++ -o $@ $(FULLOBJS)
# rule to clean (Note that it also deletes *.d files)
.PHONY: clean
clean:
rm -rf obj/*.o obj/*.d foo
# include dependency files (*.d) if available
-include $(FULLOBJS:%.o=%.d)
即使我只修改了,我也可以强迫编译器再次编译 .h文件?
是的...但是您可能想改进您的制作(工具)。
我要做的是强制所讨论的文件的最新编译,在该文件中生成的命令。
示例:
# ... noise g++ -O3 -ggdb -std=c++14 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -Wcast-align -Wcast-qual -Wconversion -Wpointer-arith -Wunused -Woverloaded-virtual -O0 lmbm101_11.cc -o lmbm101_11 -L../../bag -lbag_i686 -lnet_i686 -lposix_i686 -lzlib_i686 -lrt -pthread # ... more noise.
为了强制构建,我突出显示"命令"创建(以" G "开头,并驻留在噪声和更多噪声之间),然后调用它而不是制造。
这是使用Linux上的Emacs的微不足道。在其他系统上可能并不容易。
您可以考虑将此命令复制到文件中,以备将来使用。
(即i绕过,直到我选择修复我的制作文件为止。)
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 需要在GCC-7.2.0中具有编译错误的代码上的帮助,而在GCC-6.4.0中则不需要编译
- 生成代码以与不需要重新编译的正在运行的 cpp 应用程序交互的好方法是什么?
- 更改C 中的.h文件不需要再次编译
- 在VS中编译C++,而不需要在运行时使用MSVCP120D.dll
- 有没有一种方法可以在编译时加载到omp.h中,因此机器永远不需要在运行时获取它
- 是否可以像现在一样轻松地编译Emscripten,但不需要控制台和Emscripten徽标
- 如果我在GCC中编译并链接不需要的库,会发生什么
- 为什么Visual Studio需要<string>编译,而代码块不需要?
- 编译错误:需要指针而不是对象
- 在Visual Studio中编译不需要C++安装.net的代码
- 如果不需要,请避免在Make中进行链接和编译
- visual studio 2010 -编译单个文件,不需要IDE, c++