可以将预编译的头部用作静态链接的库的一部分吗?

时间:2014-05-13 08:25:18

标签: c++ boost stl precompiled-headers

我相信我理解有关预编译头文件的基础知识,我无法想到为什么预编译头文件无法在库中使用,但我被告知它不可能或不应该完成(不记得哪个)。

我有一个项目,其中共享库将由多个其他人静态链接,我想在共享库中使用预编译头来获取外部STL / Boost依赖项,但我不确定它是否可行。我的目标是OS X和Windows系统,常见的搜索细节似乎更多地指向涉及stdafx.h的Windows解决方案,这使我相信使用预编译的头文件通常是Windows实践。

我的问题很简单:

我可以/应该在库中使用预编译的头文件,我将静态链接到其他项目吗?如果不是,那么使用便利标头,比如说,我的所有STL / Boost依赖项都是一件好事吗?我指的是这样的事情:

// common.h
#pragma once

#include <boost/this>
#include <boost/that>
#include <string>
#include <vector>
#include <other_stl_header>

// Foo.h
#include "common.h"

class Foo { ... }

// Foo.cpp

#include "Foo.h"
...

编辑:我应该指定,我没有期望预编译的头与我正在编译的库之外的任何东西共享。我的问题与是否可以创建用于编译 库的预编译头有关。

2 个答案:

答案 0 :(得分:2)

完成编译后,不再使用预编译头,它们对链接阶段(包括共享库和任何其他可链接组件)没有影响。您可以使用它来加速共享库的编译,但就是这样,静态库是编译的结果,有或没有预先使用的头文件使用。

答案 1 :(得分:1)

预编译头不是可执行文件或任何类型的可链接格式。编译器本身可以为预编译的haeder定义任何类型的格式。也许它只是简单的标记化,也许其他一些包含和其他包含的定义已经被评估。预编译头的唯一目的是加快编译器的速度。

gcc也会按需使用预编译的标头,但使用此功能并不常见。 gcc为预编译阶段的输出生成.gch个文件。

您问题的简单答案:否