2012-06-09 70 views
6

运行:gcc版本4.2.1(苹果公司建立5664)慢编译时间与升压+ GCC +编译头

我创建了一个默认的预编译的头一个苹果XCode项目。它看起来非常慢,并且一个主要功能no的简单主文件包括无需编码需要6秒的编译,这是我升级到新的SSD驱动器后。我在笔记本电脑上,但我保留升级到工作站将缓解我的问题。如果我关闭预编译头文件,那么主文件将在一秒之内编译。看起来使用预编译头文件会对所有文件造成损失。这种延迟使我想避免编译和尝试不好的代码。这是我包括在我的预编译头文件中:

#pragma once 

#include <algorithm> 
#include <bitset> 
#include <complex> 
#include <deque> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <istream> 
#include <iterator> 
#include <limits> 
#include <list> 
#include <locale> 
#include <map> 
#include <numeric> 
#include <ostream> 
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <valarray> 
#include <vector> 

#include <boost/smart_ptr/scoped_ptr.hpp> 
#include <boost/smart_ptr/scoped_array.hpp> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/shared_array.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 
#include <boost/smart_ptr/weak_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ptr.hpp> 

#include <boost/regex.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind/bind.hpp> 
#include <boost/bind/apply.hpp> 
#include <boost/bind/protect.hpp> 
#include <boost/bind/make_adaptable.hpp> 

#include <boost/asio.hpp> 
//#include <boost/asio/ssl.hpp> 


#include <boost/property_tree/ptree.hpp> 
#include <boost/random.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/time_zone_base.hpp> 
#include <boost/circular_buffer.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics.hpp> 

我没有包含精神,这确实会使编译时间上升。

+0

因此,一个“主函数不重复的简单主文件不包含代码”比编译上述所有包含的项目花费的时间要少很多?这应该不是预期的吗? – jedwards

+0

另外,我对预编译头文件的理解是,它们只是倾向于节省编译时间,否则它们会通过来自多个源的“include”重复编译。这不是你的情况,所以我想象你使用预编译头文件的编译时间会类似于没有。也就是说,通过使用预编译头文件你不会意识到很大的收获。你真的应该限制你的包含在源文件特定的基础上你需要什么。 – jedwards

+0

这是什么意思:“这个延迟使我想避免编译和试验不好的代码。”? – jedwards

回答

7

GCC的预编译头文件以非常特殊的方式工作。只有一个预编译头文件可用于任何给定的源文件。使用-H来显示给定的头文件是否使用预编译版本。

此外,您必须使用与使用它的源文件完全相同的编译器标志来编译头文件。

建立一个PCH环境的典型方法是这样的:

main.cpp中:

#include "allheaders.hpp" 

int main() { /* ... */ } 

allheaders.hpp:

#include <algorithm> 
// ... everything you need 

编译:

g++ $CXXFLAGS allheaders.hpp     # 1 
g++ $CXXFLAGS -H -c -o main.o main.cpp  # 2 
g++ $LDFLAGS -o myprogram main.o    # 3 

步骤#1后,你应该最终得到一个文件allheaders.hpp.gch,这应该是相当大的。在步骤#2中-H标志应该产生额外的输出,告诉你正在使用预编译头文件。步骤#3链接可执行文件。

这个想法是,步骤#1可能需要很长时间,但步骤#2应该快得多。

+1

我已经分析了GCC命令,它引用了一个308 MB伪文本文件,该文件似乎是一个处理过的预编译头文件。预编译的头文件被自动包含在每个源文件中,有些人似乎没有得到,并且引入了大约6秒的延迟。我不记得有VS的视觉工作室的问题,但VS我总是在一个更强大的工作站上运行它。当我在一个文件中更改一个字母时,6秒的延迟时间是不可接受的,并且在开发周期中增加了分钟/小时/天的浪费时间。 – user805547

+0

那么,你应该对哪些头文件进行预编译。当然,你不应该有一个单一的普遍适用的PCH。理想情况下,您需要为每个*源文件单独制作一个单独的“全部标题”标题。实际上,我会为那些实际上实现所有重Boost的文件保留这种处理方式。 –

+0

我几乎在任何地方都使用boost,所以不把它们放在PCH中会导致单个文件慢慢编译。我开始认为这款笔记本电脑和软件对于严肃的C++开发来说太慢了。对可可来说很好,但Boost和模板和元编程的大量使用是一个杀手。 – user805547