不久前,我为 C libspeex 音频编解码器开发了一个 jni 包装器。 最近,我在使用 ndk r10e 编译和运行它时遇到了一些问题,因为音频编码功能在运行时崩溃了。
最后我发现当我用
编译时NDK_TOOLCHAIN_VERSION:=4.8
native 代码在使用时运行
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 指针、有符号整数溢出、堆栈分配对齐之类的事情......两个编译器都将利用这些边缘情况来生成更快的代码。如果一段代码“可能”做了一些奇怪的事情,编译器可以假设开发人员知道他们在做什么,并且已经在其他地方处理了这些情况。 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
关于android - ndk-build NDK_TOOLCHAIN_VERSION 4.8 与 clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33416410/