7

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

我创建了一个带有默认预编译头文件的苹果 XCode 项目。它似乎很慢,一个没有主要功能的琐碎主文件不包含任何代码需要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>

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

4

1 回答 1

8

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

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

设置 PCH 环境的典型方法如下:

主.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 步应该会变得更快。

于 2012-06-09T12:15:25.727 回答