Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免编译开销_C++_Compiler Construction_Spidermonkey - Fatal编程技术网

C++ 避免编译开销

C++ 避免编译开销,c++,compiler-construction,spidermonkey,C++,Compiler Construction,Spidermonkey,我正在从事SpiderMonkey项目,这是一个包含大量.h和.cpp文件的大型项目。尽管我知道我只更改了一两个文件,但每次对项目进行更改时,我都必须运行make命令并再次编译整个项目,以获得可执行的/js文件 因此,我的问题是,是否有任何解决方案可以避免编译所有文件,而只编译特定文件以获得新的可执行文件/js文件?make实用程序具有目标和依赖性的含义。只有当任何依赖项发生更改时,才重新生成目标,否则它被认为是最新的(一点简化的解释)。以下Makefile仅在任何对象文件发生更改时才会导致重建

我正在从事SpiderMonkey项目,这是一个包含大量.h和.cpp文件的大型项目。尽管我知道我只更改了一两个文件,但每次对项目进行更改时,我都必须运行
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
    设计不佳

  • 有很多依赖关系。实现文件包括许多头文件,头文件相互包含等等——只需稍作修改,就需要重新编译大量翻译单元(通常在编辑头文件时)。这将是所讨论项目的架构缺陷,只能通过重大重构来修复

  • 该项目假定使用预编译头。这通常