使用GCC的共享库项目的预编译头文件

时间:2013-05-12 01:46:17

标签: gcc precompiled-headers

我正在尝试使用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确实不可能吗?如果是,是否有任何解决方法?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

  

-fPIC:如果目标计算机支持,则发出与位置无关的代码,适用于动态链接并避免对全局偏移表的大小进行任何限制。此选项对m68k,PowerPC和SPARC产生影响。

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