C++ 避免编译开销
我正在从事SpiderMonkey项目,这是一个包含大量.h和.cpp文件的大型项目。尽管我知道我只更改了一两个文件,但每次对项目进行更改时,我都必须运行C++ 避免编译开销,c++,compiler-construction,spidermonkey,C++,Compiler Construction,Spidermonkey,我正在从事SpiderMonkey项目,这是一个包含大量.h和.cpp文件的大型项目。尽管我知道我只更改了一两个文件,但每次对项目进行更改时,我都必须运行make命令并再次编译整个项目,以获得可执行的/js文件 因此,我的问题是,是否有任何解决方案可以避免编译所有文件,而只编译特定文件以获得新的可执行文件/js文件?make实用程序具有目标和依赖性的含义。只有当任何依赖项发生更改时,才重新生成目标,否则它被认为是最新的(一点简化的解释)。以下Makefile仅在任何对象文件发生更改时才会导致重建
make
命令并再次编译整个项目,以获得可执行的/js
文件
因此,我的问题是,是否有任何解决方案可以避免编译所有文件,而只编译特定文件以获得新的可执行文件
/js
文件?make
实用程序具有目标和依赖性的含义。只有当任何依赖项发生更改时,才重新生成目标,否则它被认为是最新的(一点简化的解释)。以下Makefile仅在任何对象文件发生更改时才会导致重建目标文件,并且仅在源/头发生更改时才会重建对象文件:
all: target
target: obj1.o obj2.o
$(CC) -o $@ $^
obj1.o: obj1.c obj1.h
$(CC) -o $@ -c $<
obj2.o: obj2.c obj2.h
$(CC) -o $@ -c $<
all:目标
目标:obj1.o obj2.o
$(CC)-o$@$^
obj1.o:obj1.c obj1.h
$(CC)-o$@-c$<
obj2.o:obj2.c obj2.h
$(CC)-o$@-c$<
话虽如此,您可能应该检查项目的Makefile并检查依赖项是否正确定义。复杂的构建系统(例如autotools/automake)使用$(CC)-M或-MM来构建源的依赖项列表
另外,请检查源文件/头文件日期是否正确,而不是在将来-
make
通常会在这种情况下发出警告,因为它无法正确确定依赖项更改。这对于在一台计算机上编辑并在另一台计算机上编译的NFS文件可能特别重要。make实用程序具有目标和依赖的含义。只有当任何依赖项发生更改时,才重新生成目标,否则它被认为是最新的(一点简化的解释)。以下Makefile仅在任何对象文件发生更改时才会导致重建目标文件,并且仅在源/头发生更改时才会重建对象文件:
all: target
target: obj1.o obj2.o
$(CC) -o $@ $^
obj1.o: obj1.c obj1.h
$(CC) -o $@ -c $<
obj2.o: obj2.c obj2.h
$(CC) -o $@ -c $<
all:目标
目标:obj1.o obj2.o
$(CC)-o$@$^
obj1.o:obj1.c obj1.h
$(CC)-o$@-c$<
obj2.o:obj2.c obj2.h
$(CC)-o$@-c$<
话虽如此,您可能应该检查项目的Makefile并检查依赖项是否正确定义。复杂的构建系统(例如autotools/automake)使用$(CC)-M或-MM来构建源的依赖项列表
另外,请检查源文件/头文件日期是否正确,而不是在将来-
make
通常会在这种情况下发出警告,因为它无法正确确定依赖项更改。这对于NFS文件尤其重要,这些文件在一台计算机上编辑,在另一台计算机上编译。您可以尝试仅更改cpp文件,而不是h,因为cpp文件在项目中包含一次。
您还可以使用#pragma once指令,一些编译器具有编译加速功能。然而,您可以在您的公司中使用IncredBuild工具。它将编译分发到存在IncredBuild的所有计算机上。您可以尝试仅更改cpp文件,而不是h,因为cpp文件在项目中包含一次。
您还可以使用#pragma once指令,一些编译器具有编译加速功能。然而,您可以在您的公司中使用IncredBuild工具。它在所有有IncredBuild的计算机上分发编译。make的整个思想是仅重新构建项目中需要重建的部分,根据文件修改日期和可用的依赖关系信息来判断 如果您的项目需要很长时间才能重新编译,那么可能有三件事是罪魁祸首:
make
可用的依赖项信息不是最佳的,即make
重新编译不需要重新编译的文件,因为它认为在没有依赖项的情况下存在依赖项。这将是所讨论的Makefile
的缺陷,即Makefile
设计不佳哪一个对你的具体问题负责?我说不准,真的。(关于Spidermonkey,我一点也不知道。)make的整个想法是仅重建项目中需要重建的部分,根据文件修改日期和
make
可用的依赖信息来判断
如果您的项目需要很长时间才能重新编译,那么可能有三件事是罪魁祸首:
make
可用的依赖项信息不是最佳的,即make
重新编译不需要重新编译的文件,因为它认为在没有依赖项的情况下存在依赖项。这将是所讨论的Makefile
的缺陷,即Makefile
设计不佳