【问题标题】:Android NDK returns an error "undefined reference to 'rand'"Android NDK 返回错误“未定义对 'rand' 的引用”
【发布时间】:2015-01-18 14:24:16
【问题描述】:

我正在尝试使用 libvpx 为 Android x86 提供 webm 解码器。

我通过以下命令构建了库并得到了“libvpx.a”。

../configure --target=x86-android-gcc --disable-vp8-encoder --disable-vp9-encoder --disable-examples --sdk-path=$ANDROID_NDK_ROOT --enable-pic --enable-postproc

当我在 Windows 上通过 ndk-build 使用这个库时,发生了错误。

C:/android/[project]/jni/../plib/libvpx.a(postproc_mmx.asm.o)(.text+0x1c8): error: undefined reference to 'rand'
C:/android/[project]/jni/../plib/libvpx.a(postproc_sse2.asm.o)(.text+0x65c): error: undefined reference to 'rand'
collect2.exe: error: ld returned 1 exit status

armeabi 的 libvpx.a 没有发生错误。没有人知道解决方案吗?

(jni/Android.mk)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := sublib
LOCAL_SRC_FILES := sublib.cpp

LOCAL_LDLIBS := -llog

LOCAL_STATIC_LIBRARIES := libvpx_pre

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/../plib/Android_x86.mk

(plib/Android_x86.mk)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := libvpx_pre
LOCAL_SRC_FILES := libvpx.a
LOCAL_STATIC_LIBRARIES := cpufeatures

include $(PREBUILT_STATIC_LIBRARY)

$(call import-module,android/cpufeatures)

【问题讨论】:

    标签: android c android-ndk android-x86 libvpx


    【解决方案1】:

    与最初的印象(来自主题)相反,这不是(直接)与Cannot load library: reloc_library[1285]: cannot locate 'rand' 的重复。

    似乎在使用--target=x86-android-gcc 配置libvpx 时,它实际上不会自动选择android 编译器或尝试使用android 标头(与armv7-android-gcc 的作用相反)。 (事实上​​,如果你在 OS X 上使用--target=x86-android-gcc 编译,它甚至不会构建 linux/android 二进制文件,它最终会为 OS X 构建一个二进制文件。)

    相反,它几乎像往常一样构建,使用普通系统编译器,使用普通系统头文件(除非您手动指定它们),其中包含普通的 rand 函数,这在 Android 上不可用。 (在 5.0 之前的 Android 版本中,stdlib.h 中的 rand 函数是一个内联函数,它实际上映射到 lrand48 函数,这是二进制文件最终链接到的函数。

    (另外,在 arm 上为 android 构建时,它似乎不允许您选择要定位的 android 版本,所以如果您的 NDK 包含 android-21,它似乎会尝试使用它构建,这也会给你类似的错误,比如Cannot load library: reloc_library[1285]: cannot locate 'rand'。)

    由于配置脚本魔法似乎没有为构建 x86 android 设置正确的东西(就像它为 arm 所做的那样),您应该能够自己设置它,这需要设置更多参数:

    export PATH=<NDK>/toolchains/x86-4.8/prebuilt/*x86*/bin:$PATH
    ASFLAGS="-D__ANDROID__" CROSS=i686-linux-android- LDFLAGS="--sysroot=<NDK>/platforms/android-9/arch-x86" ./configure --target=x86-android-gcc --extra-cflags="--sysroot=<NDK>/platforms/android-9/arch-x86" --disable-examples
    make
    

    有了这个,我可以构建一个libvpx.a,它应该建立在正确的标题上,希望它对你有用。

    【讨论】:

    • 该命令通过了构建,但出现了 rand 错误。我也不断地检查一个问题。
    • 啊,显然有一些汇编代码调用 rand(),它不检查标题,而是检查 __ANDROID__ 定义。在配置命令上添加ASFLAGS="-D__ANDROID__"(在./configure 部分之前,在CROSS/LDFLAGS 部分周围)并重建。
    • 嘿 @mstorsjo 我在 ./configure 之前添加了 ASFLAGS,我得到了 unrecognized option '-__ANDROID__'
    • 我刚刚使用绝对最新的 libvpx 和最新的 NDK 重新检查了说明,它们仍然可以正常工作(除非我必须将 x86-4.8 更改为 x86-4.9)。确保正确引用参数并且没有任何多余的空格,并且您没有丢失 -D__ANDROID__ 中的 D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多