【问题标题】:Android NDK linking problemsAndroid NDK 链接问题
【发布时间】:2011-12-20 22:25:19
【问题描述】:

我用 NDK 编译了 Sox et al。所以,我拥有所有 Android 友好的共享库。

我创建了一个simple test file,它调用了一个 sox 函数。 NDK 构建告诉我:

undefined reference to `sox_open_read'

sox_open_read 在 sox.h 中定义。我知道它正在查找 sox.h,因为它给了我关于该文件的警告:

In file included from (...)/sox/sox.h:19

所以也许它想在实际的 libsox.so 中找到 sox_open_read。好吧,我已经尝试了大约 100 种不同的方法来告诉它 sox 共享库在哪里,例如

LOCAL_SHARED_LIBRARY := sox
LOCAL_LDLIBS    := -L$(LOCAL_PATH_FULL)/jni/libs/libsox.so

但是,如果我将 Sox 指定为静态库,它将起作用:

#LOCAL_SHARED_LIBRARY := sox
LOCAL_STATIC_LIBRARIES := sox
LOCAL_LDLIBS    := -L$(LOCAL_PATH_FULL)/jni/libs/libsox.so

据我了解,我不想静态链接到 sox 库 - 我想动态链接到它。

【问题讨论】:

    标签: android c linker android-ndk ld


    【解决方案1】:

    您应该将 libsox.so 定义为预构建库。如下创建一个 makefile,并将预构建的 libsox.so 与此 makefile 放在同一目录中。之后,您可以像重建它一样使用 libsox。不要忘记将此 makefile 包含到您的构建中。

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := libsox
    LOCAL_SRC_FILES := libsox.so
    
    include $(PREBUILT_SHARED_LIBRARY)
    

    【讨论】:

    • 感谢您的帮助。然而,这不是问题。我已经将所有库定义为这样的预构建:pastebin.com/de0u99tu
    • 我认为this 可能是您的问题。您尝试从 libsox 使用的功能可能会在您的 libsox 构建期间被剥离。您可以使用 nm 命令检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2011-09-07
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多