当前我正在尝试编译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设置为虚假预编译和真正的后编译,但我相信我会在每次运行时都会忘记它。
有没有人遇到类似的问题或没有人知道如何解决这个问题?这将是一个很大的帮助。
我可以确认我的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
等效#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