2013-03-22 33 views
0

Android/NDK項目,與NDK版本一直工作到r8c。在8d和8e,我得到一個編譯錯誤消息在armeabi-V7A編譯:NDK錯誤:「無法解析」.data.rel.ro.local「

Compile++ thumb : myproject <= MyFile.cpp 
C:\cygwin\tmp\ccFXOc2F.s: Assembler messages: 
C:\cygwin\tmp\ccFXOc2F.s:1935: Error: can't resolve `.data.rel.ro.local' {.data.rel.ro.local section} - `.LPIC44' {*UND* section} 

的armeabi,MIPS和x86建立在同一個項目是成功的。

它可靠地彈出在同一個文件上。該文件沒有什麼特別的 - vanilla C++,它編譯並在許多其他平臺(iOS,Windows,NDK r8c等)上工作。沒有STL。它確實定義了一個健康數量的字符串常量(AKA初始化只讀數據)。可能會發生什麼?

已經嘗試完全重建,甚至刪除了obj文件夾。

C++的標誌是:

LOCAL_CPPFLAGS := -fshort-wchar -fsigned-char -Wno-psabi 

我知道NDK自帶GCC的多個版本;工具鏈可能會改變嗎?究竟如何?

+0

你能檢查臨時彙編文件的第1935行是什麼嗎? – auselen 2013-03-22 19:21:22

+0

否;該程序集將在* make *終止時從臨時文件夾中消失。相反,我使用了一種經過驗證的真實技術來評論文件中每個函數的主體,然後逐漸添加代碼直到錯誤再次出現。這種方法收斂於O(log N)時間的故障線路。 :) – 2013-03-23 19:52:47

回答

0

當然看起來像一個編譯器bug。它涉及對大量靜態常量數據的索引訪問。當我稍微改寫了一份完全無害的陳述時,錯誤信息就消失了。

曾經是:

void SomeMethod() 
{ 
    static LPCWSTR pComments = 0; 
    if(!pComments) 
     pComments = Comments; 

    DoSomething(pComments[i]); //Now it works. 
} 

Ooky,怪異的東西:

//In global scope 
static const LPCWSTR Comments[] = {L"A lot of strings here", L"String 2", L"String 3" /* and many more */ }: 

void SomeMethod() 
{ 
    DoSomething(Comments[i]); //That was the offending line - commenting it out would get rid the error 
} 

與替換。