ndk-build NDK_TOOLCHAIN_VERSION 4.8 对比 clang

ndk-build NDK_TOOLCHAIN_VERSION 4.8 vs clang

前段时间我为 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

gcc和clang是完全不同的C编译器。他们没有共同的代码。

当然,它们不是在真空中开发的。两种编译器的开发人员确实相互竞争以生成最佳/最快的机器代码。虽然它们执行的优化可能基于相同的想法,但它们都有不同的边缘情况,这些情况将以不同的方式编译。

由于 clang 是要开发的最新编译器,他们确实尝试编译具有 gcc 编译历史的其他开源项目。只要发现错误,就会更改 clang 或开源项目。

C 语言标准还留下了许多未定义的行为。除以零、取消引用 NULL 指针、有符号整数溢出、堆栈分配对齐等事情......两种编译器都会利用这些边缘情况来生成更快的代码。如果代码块 "might" 做了一些奇怪的事情,编译器可以假定开发人员知道他们在做什么并且已经在别处处理了这些情况。 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html