前段时间我为C libspeex音频编解码器开发了一个jni包装器。 最近我在使用ndk r10e编译和运行时遇到了一些问题,因为音频编码功能在运行时崩溃了。
最后我发现当我用
编译时NDK_TOOLCHAIN_VERSION:=4.8
使用
运行本机代码NDK_TOOLCHAIN_VERSION:=clang
它崩溃了。我想知道两个工具链之间的区别。
崩溃的logcat:
11-02 14:26:33.642 1908-1908/com.ermes.intau D/dalvikvm: GC_FOR_ALLOC freed 1248K, 20% free 34140K/42456K, paused 102ms, total 102ms
11-02 14:26:33.642 1908-2514/com.ermes.intau A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 2514 (Thread-103909)
11-02 14:26:33.742 1908-1908/com.ermes.intau D/dalvikvm: GC_FOR_ALLOC freed 6K, 18% free 34883K/42456K, paused 89ms, total 89ms
答案 0 :(得分:4)
gcc和clang是完全不同的C编译器。他们没有共同的代码。
当然,它们不是在真空中开发的。两个编译器的开发人员确实相互竞争,以生成最佳/最快的机器代码。虽然他们所执行的优化可能基于相同的想法,但它们都有不同的边缘情况,将以不同的方式进行编译。
由于clang是最新开发的编译器,他们会尝试编译其他有gcc编译历史的开源项目。无论何时发现错误,任何clang或开源项目都会被更改。
C语言标准也留下了许多未定义的行为。比如零除,取消引用NULL指针,有符号整数溢出,堆栈分配对齐......两个编译器都会利用这些边缘情况生成更快的代码。如果代码块“可能”做了一些奇怪的事情,编译器可以假设开发人员知道他们在做什么,并在其他地方处理过这些情况。 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html