【问题标题】:Export functions from static library to shared将函数从静态库导出到共享
【发布时间】:2014-01-15 14:33:42
【问题描述】:

在 Android NDK 中,我尝试从小型“模块”(静态库)构建共享库。例如:

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := module1
LOCAL_SRC_FILES := module1.c

include $(PREBUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := module2
LOCAL_SRC_FILES := module2.c

include $(PREBUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := main-module

LOCAL_STATIC_LIBRARIES := module1 \ module2

include $(BUILD_SHARED_LIBRARY)

但是,当我尝试从共享库(主模块)调用模块 1 和模块 2 的函数时,它们不可见。

module1.c 和 module2.c 中的函数是可导出的,因为如果构建这样的库,我可以直接调用它们:

include $(CLEAR_VARS)

LOCAL_MODULE    := module1
LOCAL_SRC_FILES := module1.c

include $(BUILD_SHARED_LIBRARY)

如何标记静态库中的函数在共享库中可见(如第一个示例中所述)。可能需要任何编译器/链接器标志吗?

【问题讨论】:

    标签: android c android-ndk java-native-interface static-libraries


    【解决方案1】:

    使用 BUILD_STATIC_LIBRARY 而不是 PREBUILD_STATIC_LIBRARY。

    前者是您如何定义一个“静态库”模块,该模块将包含通过编译 LOCAL_SRC_FILES 中的源获得的目标文件。

    ndk-build 无法识别后者,将被忽略。

    为了澄清,还存在 PREBUILT_STATIC_LIBRARY(注意“T”),当您有二进制库文件(例如 libmodule1.a)时使用它。

    有关模式的详细信息,请参阅 $NDK/docs/ANDROID-MK.html。

    【讨论】:

    • 感谢提示“T”你救了我的一天
    【解决方案2】:

    不幸的是,BUILD_STATIC_LIBRARY 也不起作用。我认为原因是主模块不使用任何源文件,如果我包含至少一个使用来自其中一个模块的函数的源文件,这些模块将包含在主模块中。例如:

    Android.mk:

    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := module1
    LOCAL_SRC_FILES := module1.c
    
    include $(BUILD_STATIC_LIBRARY)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := module2
    LOCAL_SRC_FILES := module2.c
    
    include $(BUILD_STATIC_LIBRARY)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := main-module
    LOCAL_SRC_FILES := mainmodule.c
    LOCAL_STATIC_LIBRARIES := module1 \ module2
    
    include $(BUILD_SHARED_LIBRARY)
    

    在示例中 mainmodule.c 使用了 module1 和 module2 中的一些函数。

    但是如何在没有 mainmodule.c 的情况下将静态模块包含到主模块中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多