更改C 中的.h文件不需要再次编译

Changed .h file in C++ does not need to be compiled again?

本文关键字:编译 不需要 文件 中的 更改      更新时间:2023-10-16

我有以下问题。成功编译后,如果我在一个.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绕过,直到我选择修复我的制作文件为止。)