2010-08-09 152 views
3

当前我正在尝试编译Android本机代码。代码来自Android的OpenCV端口。我在项目中正确粘贴了所有代码,并相应地编辑了我的make文件。当我把android:debuggable设置为false时,一切正常,我得到了我的本地库。当我尝试,而android:debuggable设置为true时,我得到一个错误。这里是日志的一部分:编译原生Android代码时出现内部编译器错误

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来避免这种情况。我已经尝试过,但仍然出现此错误。

现在我不太在乎调试我的本机代码,但我想要启用基本的调试。我不想在每次我想编译时在我的清单中继续切换android:debuggable。我甚至不确定是否可以,如果我只是将android:debuggable设置为虚假预编译和真正的后编译,但我相信我会在每次运行时都会忘记它。

有没有人遇到类似的问题或没有人知道如何解决这个问题?这将是一个很大的帮助。

回答

2

解决方法是预先编译导致编译器错误并关闭调试的代码。然后将其作为预制件装入。然后你可以通过调试来构建其余部分。我有这个问题(或类似),并张贴在Google Group

参考Dev Guide的Prebuilts部分。

+0

我可以确认我的NEON内在函数使用ndk-build NDK_DEBUG = 0正确编译。在我的情况下,而不是使用预构建,更容易#定义ANDROID_GCC_NEON_BUG!NDEBUG,并且我将每个函数定义与#if CPU_HAS_NEON &&!ANDROID_GCC_NEON_BUG ... – 2012-02-21 23:06:44

+0

等效#wrap80,我的解决方案适用于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 – 2012-02-22 00:19:55