编译本地Android代码时出现内部编译器错误

3

我目前正在尝试为Android编译本地代码。这段代码来自于OpenCV针对Android的移植版本。我已经正确地将所有代码粘贴到我的项目中,并相应地编辑了我的make文件。当我将android:debuggable设置为false时,一切都正常工作,我可以得到我的本地库。但是当我将android:debuggable设置为true时,就会出现错误。以下是日志的一部分:

Compile++ thumb: cxcore <= AR_Still_Image/jni/cxcore/src/cxutils.cpp
AR_Still_Image/jni/cxcore/src/cxutils.cpp: In function 'void icvSort16u(ushort*, size_t, int)':
AR_Still_Image/jni/cxcore/src/cxutils.cpp:987: internal compiler error: in reload, at reload1.c:1173
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
make: *** [AR_Still_Image/obj/local/armeabi/objs/cxcore/cxcore/src/cxutils.o] Error 1

根据我在互联网上的发现,这是编译优化级别引起的。只要代码不被编译为可调试状态,一切都应该没问题。
现在显然可以通过在Application.mk中设置APP-OPTIM := release或将-O2添加到LOCAL_CFLAGS来避免此问题。我已经尝试了两种方法,但仍然出现了错误。
现在我并不太关心调试本机代码,但我希望启用基本调试功能。我不想每次编译时都切换manifest中的android:debuggable。我甚至不确定如果我只是在编译前将android:debuggable设置为false,然后在编译后将其设置为true是否可以,但我肯定会忘记它的。
有没有人遇到类似的问题或知道如何解决?这将是一个很大的帮助。
1个回答

2
一种解决方法是使用关闭调试的方式预先构建导致编译器错误的代码。 然后将其作为预构建引入。 之后可以使用调试构建其余部分。 我曾经遇到过这个问题(或类似问题),并在Google Group上发帖求助。

请参考开发者指南中的预构建部分。


我可以确认我的NEON intrinsics使用ndk-build NDK_DEBUG=0正确编译。在我的情况下,与其使用预构建,更容易的做法是#define ANDROID_GCC_NEON_BUG !NDEBUG,并且我使用#if CPU_HAS_NEON && !ANDROID_GCC_NEON_BUG...将每个函数定义进行封装. - jd.
顺便提一下,我的解决方案适用于ndk r7b(gcc 4.4.x)。这里有更多信息,并且令人兴奋的是,gcc 4.6.2已经在上游修复了此问题。http://grokbase.com/t/gg/android-ndk/11bw65h5sf/internal-compiler-error-in-reload-cse-simplify-operands-at-postreload-c-396-with-neon-intrinsics-in-ndk-7 - jd.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接