【问题标题】:ndk-build NDK_TOOLCHAIN_VERSION 4.8 vs clangndk-build NDK_TOOLCHAIN_VERSION 4.8 vs clang
【发布时间】:2016-01-29 17:21:39
【问题描述】:

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

【问题讨论】:

  • 能否请您发布崩溃堆栈?
  • 就这些了吗?应该有来自系统进程的带有 DEBUG 标记的长堆栈跟踪

标签: android android-ndk java-native-interface toolchain


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多