2

我正在尝试使用 GCC 为我的共享库创建一个预编译的头文件。在进行必要的配置并尝试构建后,我收到了以下警告:

cc1plus: warning: ./PrecompiledHeaders.h.gch/.c++: created and used with different settings of -fpic [enabled by default]

经过一段时间的搜索,我发现这段代码似乎表明 PCH 不适用于共享代码:

/* -fpic and -fpie also usually make a PCH invalid.  */
if (data[0] != flag_pic)
  return _("created and used with different settings of -fpic");
if (data[1] != flag_pie)
  return _("created and used with different settings of -fpie");
data += 2;

所以我把我的库改成静态库,错误消失了,编译时间也减少了!那么确实不可能有一个带有共享库的 PCH 吗?如果是,是否有任何解决方法?

4

2 回答 2

3

您发布的消息和代码并不表明 PCH 不能与共享代码一起使用。-fpic它告诉您在编译没有 的代码时不能使用编译的 PCH 文件-fpic,反之亦然。对-fpie.

根据架构,-shared可能暗示-fpic或其他此类选项。

您需要使用与编译其余代码相同的选项来预编译头文件。如果您希望能够将 PCH 用于静态和动态构建,您将需要(至少)两组不同的预编译头文件。

于 2013-05-12T09:00:22.303 回答
1

Mat 的回答是正确的,但它并没有解决我的问题,因为我在编译 PCH 文件时已经尝试添加 -fpic 并且它不起作用。事实证明,我需要 -fPIC 标志而不是 -fpic。我不确定具体原因,但可能是因为我的 PCH 文件太大。引用 GCC 手册页:

-fPIC:如果目标机器支持,则发出与位置无关的代码,适用于动态链接并避免对全局偏移表大小的任何限制。此选项在 m68k、PowerPC 和 SPARC 上有所不同。

最后一句话让我感到困惑,他们说这只对 m68k、PowerPC 和 SPARC 有影响,但我的机器是 Intel i7(第 3 代)!

于 2013-05-12T17:39:52.567 回答