如何限制Android.mk编译模块只生成64位库

问题描述

我能够在 android 中为 arm 平台集成一个 64 位预建库“x”,当我尝试在所需模块中调用该库时,该库将为 32 位和 64 位库编译失败,提到“x”的 32 位库是未找到。 /out/target/product/xxxx/system/lib64/libxxxx.so

  1. 预建库生成文件
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := libfoo.so
    LOCAL_MODULE := libfoo
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_MODULE_PATH := $(TARGET_OUT)/lib64
    LOCAL_MODULE_TAGS := debug
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
    include $(BUILD_PREBUILT
  1. 链接模块 Makefile
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := \
        test.c 
        
    LOCAL_SHARED_LIBRARIES := \
        liblog \
        libcutils 

    LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

    ifeq ($(TARGET_ARCH),arm64)
       LOCAL_SHARED_LIBRARIES   += libfoo.so
    endif

    LOCAL_CFLAGS += -Wall -Werror 
    LOCAL_MODULE := vtest
    LOCAL_MODULE_RELATIVE_PATH := test
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_SHARED_LIBRARY)
ninja: error: 'out/target/product/xxxx/obj_arm/SHARED_LIBRARIES/libxxxx_intermediates/export_includes',needed by 'out/target/product/xxxx/obj_arm/SHARED_LIBRARIES/yyyyy/import_includes',missing and no kNown rule to make it

我想限制链接模块只为 64 位而不是 32 位构建,我尝试了以下但不起作用 ifeq ($(TARGET_ARCH),arm64) LOCAL_SHARED_LIBRARIES += libxxx 结束

请提供解决此问题的建议

解决方法

来自https://source.android.com/setup/develop/64-bit-builds

LOCAL_MODULE_TARGET_ARCH

将此变量设置为架构列表,例如 arm x86 arm64。如果正在构建的架构在该列表中,则当前模块包含在构建系统中。

LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH

这个变量与LOCAL_MODULE_TARGET_ARCH相反。如果正在构建的架构不在该列表中,则构建系统包含当前模块。

,

最后通过以下更改修复并有效

LOCAL_MODULE_TARGET_ARCH := arm64
LOCAL_LDLIBS += $(LOCAL_PATH)/libfoo.so
                                                        

代替

 ifeq ($(TARGET_ARCH),arm64)
   LOCAL_SHARED_LIBRARIES   += libfoo.so
endif

@maurice 你说得部分正确,感谢你的输入,它的 LOCAL_LDLIBS 与 Target Arch 一起帮助