2013-03-22 175 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 
} 

与替换。