编译强制静态可执行程序注意事项

编译强制可执行程序模板:

关键就是打开LOCAL_FORCE_STATIC_EXECUTABLE := true,这样这个可执行程序就不会依赖libc等动态库,可以独立运行。

include $(CLEAR_VARS)
LOCAL_MODULE := echo_sim_test
LOCAL_SRC_FILES := echo_sim_test.c
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/data
LOCAL_CFLAGS += $(PCBA_FLAG)
#LOCAL_MULTILIB := 32
LOCAL_FORCE_STATIC_EXECUTABLE := true
include $(BUILD_EXECUTABLE)

但是,如果你的程序依赖一个本地静态库,在Android8上就会编译不过,报找不到库里面声明的函数,如:

include $(CLEAR_VARS)
LOCAL_MODULE := echo_encryption_test
LOCAL_SRC_FILES := echo_encryption_test.c
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/data
LOCAL_LDLIBS := $(LOCAL_PATH)/lib64/libcw_neowine_check.a
LOCAL_MULTILIB := 64
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_STATIC_LIBRARIES := libcw_neowine_check
include $(BUILD_EXECUTABLE)

这时如果把LOCAL_FORCE_STATIC_EXECUTABLE := true移除,即可编译通过,但有时,我们就要求不依赖动态库运行,那就需要做如下转换

include $(CLEAR_VARS)
LOCAL_MODULE := echo_encryption_test
LOCAL_SRC_FILES := echo_encryption_test.c
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/data
LOCAL_MULTILIB := 64
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_STATIC_LIBRARIES := libcw_neowine_check
include $(BUILD_EXECUTABLE)

include $(LOCAL_PATH)/lib64/Android.mk


在lib64下建立Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE := libcw_neowine_check
LOCAL_SRC_FILES := libcw_neowine_check.a
include $(BUILD_PREBUILT)


即先将静态库预编译到out下,仍使用原来强制静态可执行程序的编译方法编译就可以了

还有一种异常情况,非常诡异,出现时较难排查,如:

目标是编译出echo_camera_test,依赖一个libcamsys的静态库,这个静态库是有源码的。

# =====================================================
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := echo_camera_test
LOCAL_SRC_FILES := echo_camera_test.c
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/data
#LOCAL_CFLAGS += $(PCBA_FLAG)
#LOCAL_MULTILIB := 32
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_STATIC_LIBRARIES := libcamsys
LOCAL_SHARED_LIBRARIES := \
    libui \
    libbinder \
    libutils \
    libcutils \
    libhardware \
	libion \
    libdl \
    libgralloc_drm
include $(BUILD_EXECUTABLE)


# =================for camera test start===================
include $(LOCAL_PATH)/rk3399-camera/Android.mk
# =================for camera test end=====================


libcamsys Android.mk如下:

################################################

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    camera_test.c \
	OV5648_MIPI.c \
	OV13850_MIPI.c

LOCAL_C_INCLUDES += \
    frameworks/base/include/ui \
    bionic \
    external/stlport/stlport

LOCAL_SHARED_LIBRARIES := \
    libui \
    libbinder \
    libutils \
    libcutils \
    libhardware \
	libion \
    libdl \
    libgralloc_drm

	
# LOCAL_SHARED_LIBRARIES := libz libc libcutils libutils libion
# LOCAL_SHARED_LIBRARIES += libdl libhardware libgralloc_drm libdrm libdrm_rockchip
LOCAL_CFLAGS += -fno-short-enums

LOCAL_MODULE := libcamsys

include $(BUILD_STATIC_LIBRARY)

编译时会报error: undefined reference to 'hw_get_module',但是头文件和依赖库都加进去了啊,为什么编不过?

一开始排查注释掉hw_get_module调用可以编过,无意间单独编译这个库文件是可以编过的。这就说明很有可能与编译echo_camera_test这个可执行程序的Android.mk有关。注释掉LOCAL_FORCE_STATIC_EXECUTABLE果然就好了。

发布了44 篇原创文章 · 获赞 31 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u013463707/article/details/98050104