0

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

4

1 回答 1

0

对我来说肯定看起来像一个编译器错误。它与对大量静态 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.
}

好可怕的东西。

于 2013-03-22T16:53:16.343 回答