2013-05-12 115 views
1

我想爲使用GCC的共享庫創建預編譯的頭文件。進行必要的配置,並試圖建立後,我得到了這些警告:使用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?如果是的話,有沒有解決這個問題?

回答

3

您發佈的消息和代碼並不表明PCH不能與共享代碼一起使用。它告訴你在編譯代碼時不能使用用-fpic編譯的PCH文件,反之亦然。 -fpie也是如此。

根據體系結構,-shared可能意味着-fpic或其他此類選項。

您需要使用與編譯代碼其餘部分相同的選項預編譯頭文件。如果您希望能夠將PCH用於靜態和動態構建,則需要(至少)兩組不同的預編譯頭文件。

+0

謝謝評論。請參閱我剛添加的答案,如果您對此有任何評論,請告訴我。 – Rafid 2013-05-12 17:40:24

+0

'-fPIC'是x86_64共享對象的唯一選項。我對複雜的細節不太熟悉,但是您可以在這裏找到更多信息和鏈接:http://stackoverflow.com/questions/3961446/why-does-gcc-not-implicitly-supply-the-fpic- flag-when-compiling-static-librarie - 這就是爲什麼我說'使用相同的選項'而不是告訴你到底應該添加什麼標誌 - 確切的選項取決於你的架構。 – Mat 2013-05-12 17:55:20

1

Mat的答案是正確的,但它沒有解決我的問題,因爲我在編譯PCH文件時已經嘗試添加-fpic,並且它不起作用。事實證明,我需要-fPIC標誌而不是-fpic。我不清楚爲什麼,但可能是因爲我的PCH文件太大。引用GCC手冊頁:

-fPIC:如果支持對目標機器,發射與位置無關的代碼,適合動態鏈接,避免對全局偏移表的尺寸的任何限制。這個選項在m68k,PowerPC和SPARC上有所不同。

我最後的聲明讓我感到困惑,他們說這隻會在m68k,PowerPC和SPARC上有所不同,但我的機器是Intel i7(第三代)!