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