【问题标题】:NDK error: "can't resolve `.data.rel.ro.local'"NDK 错误:“无法解析 `.data.rel.ro.local'”
【发布时间】:2013-03-22 15:52:40
【问题描述】:

Android/NDK 项目,使用 NDK 版本一直到 r8c。在 8d 和 8e 下,我在 armeabi-v7a 构建时收到一条编译错误消息:

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;工具链更改可能有帮助吗?具体如何?

【问题讨论】:

  • 您是否能够检查临时程序集文件第 1935 行的内容?
  • 否; make 终止时,程序集将从临时文件夹中消失。相反,我使用了一种久经考验的真正技术,即注释掉文件中每个函数的主体,然后一点一点地添加代码,直到错误再次出现。这种方法在 O(log N) 时间内收敛到故障线上。 :)

标签: android compiler-errors android-ndk


【解决方案1】:

在我看来肯定是一个编译器错误。它与对大量静态 const 数据的索引访问有关。当我稍微改写了一个完全无辜的陈述时,错误消息就消失了。

曾经是:

//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
}

替换为:

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

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

好可怕的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2011-02-23
    • 2018-03-08
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多