我在Android NDK中有一个测试应用。以前我能够使用提供的静态库编译和运行此应用程序。提供的静态库是" libfulllib.a"。现在我已经编写了包装器函数并创建了一个包装函数的库,即" libwrapper.a"。我工作的android.mk文件如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := rip_test
LOCAL_SRC_FILES := src/rip_test.cpp
LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../RIP/include/ \
$(LOCAL_PATH)/../../../hardware/libhardware/include/hardware \
$(LOCAL_PATH)/../../../hardware/libhardware/include \
$(LOCAL_PATH)/src \
$(LOCAL_PATH)/../../RIP/inc \
LOCAL_SHARED_LIBRARIES = libsmem.sastra
LOCAL_LDFLAGS := \
-v \
-L$(ANDROID_PRODUCT_OUT)/system/lib \
-lsmem.$(TARGET_BOARD_PLATFORM) \
-L$(LOCAL_PATH)/../../RIP/library \
-lwrapper \
-lfulllib \
-llog \
-lcutils \
-lipc.$(TARGET_BOARD_PLATFORM) \
# this option will build executables instead of building library for
# android application.
include $(BUILD_EXECUTABLE)
这里的包装器是由我制作的库,完整包含函数的真实定义。 现在我不想让fulllib暴露给任何人,所以我把所有的" .o"来自包装和" fulllib。"并且制作了一个全部的'图书馆。现在我的android.mk看起来像这样:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := rip_test
LOCAL_SRC_FILES := src/rip_test.cpp
LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../RIP/include/ \
$(LOCAL_PATH)/../../../hardware/libhardware/include/hardware \
$(LOCAL_PATH)/../../../hardware/libhardware/include \
$(LOCAL_PATH)/src \
$(LOCAL_PATH)/../../RIP/inc \
LOCAL_SHARED_LIBRARIES = libsmem.sastra
LOCAL_LDFLAGS := \
-v \
-L$(ANDROID_PRODUCT_OUT)/system/lib \
-lsmem.$(TARGET_BOARD_PLATFORM) \
-L$(LOCAL_PATH)/../../RIP/library \
-lall \
-llog \
-lcutils \
-lipc.$(TARGET_BOARD_PLATFORM) \
# this option will build executables instead of building library for
# android application.
include $(BUILD_EXECUTABLE)
我能够编译,但测试应用程序不能正常工作。我想问一下: 这样做是否安全?
两者之间可能有什么区别?
答案 0 :(得分:0)
合并两个静态库时可能会导致问题的一些事情:
两个库中都有重复的符号。
如果两个模块都定义了一个函数foo
,则未定义哪个模块将被使用。即使没有合并库也是如此,但通常使用找到的第一个符号,如果重新打包库使fulllib
中的符号现在在wrapper
之前,则可能使用了不同的定义
多个具有相同名称的.o文件。
有很多方法可以安全地执行此操作,但是根据您在libfulllib.a中创建liball.aa foo.o的方式,可能会在libwrapper.a中覆盖一个(反之亦然)。
这可能不是一个详尽的清单,但这些是我过去遇到的一些问题。