使用Boost + GCC +预编译头进行慢编译时间

时间:2012-06-09 06:46:17

标签: c++ gcc boost compilation precompiled

正在运行:gcc版本4.2.1(Apple Inc. build 5664)

我创建了一个带有默认预编译头的Apple 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>

我没有包括精神,这真的使编译时间上升。

1 个答案:

答案 0 :(得分: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应该变得更快。