2011-03-17 16 views
5

我正在一個32位SLES10機器上構建。使用GCC 3.4.2請解釋這個鏈接錯誤:在章節中引用.rodata

下面是一個簡單的錯誤

`.L8245' referenced in section `.rodata' of CMakeFiles/myproj.dir/c++/util/MyObj.o: defined in discarded section 
`.gnu.linkonce.t._ZN5boost9re_detail9reg_grep2INS0_21grep_search_predicateIPKcSaIcEEES4_cNS_12regex_traitsIcEES5_S5_EEjT_T0_SA_RKNS_14reg_expressionIT1_T2_T3_EEjT4_' of CMakeFiles/myproj.dir/c++/util/MyObj.o 

回答

5

這通常是由於2個不同的.cpp的被編譯不同的編譯器開關 - 也使用相同的模板。生成的模板實例可能在它們定義/引用的內容上有所不同,並且如果選擇的實例化沒有定義/引用與丟棄的實例相同的符號,則可能會出現此錯誤。

驗證您的所有.cpp是使用完全相同的編譯器開關編譯並定義的。如果這不可行,請在鏈接器命令行上重新排序.obj文件,特別是嘗試將錯誤消息中提到的.obj文件移至.obj文件列表的末尾或開頭。

編輯:

此外,如果你對鏈接預構建的C++庫,看看你是否可以複製用於構建這些庫的編譯器開關。

+0

+1如果你更新你的操作系統(在我的情況下是Ubuntu),確保你在用新的gcc/ld重建之前清理乾淨。您可能還需要重建以前建立的任何第三方庫。 – kfmfe04 2012-10-29 20:53:49

3

這可能是由於使用了更新版本的binutils。 binutils版本2.15將此視爲非致命錯誤,但更高版本的binutils已更改,因此鏈接開始失敗。有關類似報告,請參閱https://bugzilla.redhat.com/show_bug.cgi?id=191618

就我而言,我能夠通過明確使用binutils 2.16.1而不是binutils 2.17來重新鏈接。