在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)
但是当我尝试从共享库(主模块)调用它们时,module1和module2中的函数不可见。
module1.c和module2.c中的函数是可导出的,因为如果构建这样的库我可以直接调用它们,例如:
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
include $(BUILD_SHARED_LIBRARY)
如何在共享库中显示静态库中的函数(如第一个示例中所述)。可能需要任何编译器/链接器标志吗?
答案 0 :(得分:1)
使用BUILD_STATIC_LIBRARY而不是PREBUILD_STATIC_LIBRARY。
前者是如何定义一个'静态库'模块,它将包含通过编译LOCAL_SRC_FILES中的源获得的目标文件。
后者无法被ndk-build识别,将被默默忽略。
为了澄清,还存在PREBUILT_STATIC_LIBRARY(注意“T”),当你有二进制库文件(例如libmodule1.a)时使用它。
有关模式详情,请参阅$ NDK / docs / ANDROID-MK.html。
答案 1 :(得分:0)
不幸的是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的情况下将静态模块包含到主模块中?