在C ++中更改.h文件不需要再次编译?

时间:2016-06-22 18:59:55

标签: c++ makefile compilation header-files

我有以下问题。在成功编译之后,如果我在仅更改其中一个.h文件中的某些内容后再次编译它,则计算机会说:

make:“全部”没什么可做的。

即使我只修改了.h文件,我可以强制编译器再次编译吗?

5 个答案:

答案 0 :(得分:5)

如果希望在头文件更改时更新输出,则必须将其添加到依赖语句中:

 myprogram: myprogram.cpp myprogam.h
      c++ -o myprogram myprogram.cpp

通常我们不这样做,因为执行操作的代码保留在cpp文件中。如果您使用的是unix并且想要强制重建,只需触摸cpp文件以使用“touch myprogram.cpp”更新其时间戳(强制重建),或者删除现有的可执行文件。

如果你使用没有Makefile的make,让它推断依赖,它可能不会推断出头依赖。在这种情况下,要么吹走可执行文件,要么触摸源文件。

答案 1 :(得分:3)

听起来你的Makefile没有正确配置依赖项。这就是你应该考虑的问题。

如果你真的想强制重建而不是解决潜在的问题。然后你可以在make clean之前做make all,或者如果Makefile没有“干净”目标,删除所有生成的目标文件和libs / executables,然后再次运行make all

答案 2 :(得分:2)

您可以使用make命令行选项强制--always-make重建所有内容。

但是,听起来您没有在Makefile中正确设置依赖项。如果您的代码(.cpp文件)实际上包含标题,那么通常您编译它们的目标应该具有它包含的头文件的先决条件。

答案 3 :(得分:1)

有一种比接受的答案更简单的方法。只需将-MD添加到Makefile中的编译器标志,并将-include myfile.d添加到Makefile的末尾(列出所有带有* .d扩展名的源文件)。这将分别在make时生成并引用构建文件夹中的其他* .d依赖文件(无论您的* .o文件在哪里),因此您不需要将每个头文件显式添加到makefile中的依赖关系。

这对于包含长文件头列表的项目非常有用。此外,通过这种方式,您知道您可以忘记在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/
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 $(FULLOBJS) foo $(FULLOBJS:%.o=%.d)

# include dependency files (*.d) if available
-include $(FULLOBJS:%.o=%.d)

答案 4 :(得分:0)

  

即使我只修改过,也可以强制编译器再次编译   .h文件?

是的......但你可能想要改进你的品牌(工具)。

我所做的是强制执行相关文件的最新编译,其中make生成的命令显示在其中。

示例:

# ... 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.

要强制构建,我会突出显示&#34;命令&#34; make created(以&#34; g ++&#34;开头,并且介于噪音和更多噪音之间),并调用它而不是make。

这在Linux上使用emacs是微不足道的。在其他系统上可能不那么容易。

您可以考虑将此命令复制到文件中,以备将来使用。

(即我绕过make直到我选择修复我​​的make文件。)