android - 解决 Android makefile 中的循环依赖

标签 android ndk-build

我们正在开发一个项目,需要从静态库创建共享库。我们面临的问题是静态库包含循环依赖。以下是我的 makefile 的示例:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 
LOCAL_MODULE := Mylib1
LOCAL_SRC_FILES := lib/libMylib1.a
include $(PREBUILT_STATIC_LIBRARY)

           ....

           ....

           ....

LOCAL_MODULE  := DisplayDriver

LOCAL_SRC_FILES := \

            file1.c \
            file2.c \
            file3.c

LOCAL_STATIC_LIBRARIES := -Wl,--start-group \

                       Mylib1 \
                       Mylib2 \
                       Mylib3 \
                       Mylib4 \
                      -Wl,--end-group


LOCAL_C_INCLUDES :=  \

           $(LOCAL_PATH)/include \
           $(LOCAL_PATH)/examples \


LOCAL_CFLAGS := -x c -DHAVE_STDINT -DHAVE_SETENV -DNDEBUG -c

LOCAL_LDLIBS += -llog

APP_ABI := armeabi-v7a

include $(BUILD_SHARED_LIBRARY)

当我给出 ndk-build V=1 时,我可以在输出中清楚地看到 -Wl,--start-group 和 -Wl,--end-group 在创建时从编译中删除共享库。那么是否还有其他明显的标志而我错过了相同的标志?

我在 Windows 7 64 位上使用 NDK R9。

最佳答案

LOCAL_STATIC_LIBRARIES 中指定的 -Wl,--start-group 似乎被忽略。

过去使用 LOCAL_GROUP_STATIC_LIBRARIES 在链接时将静态库与 -Wl,--start-group-Wl,--end-group 分组。

现在(ndk-10c)唯一相关的变量是 LOCAL_WHOLE_STATIC_LIBRARIES,它使用链接器标志 --whole-archive

This is generally useful when there are circular dependencies between several static libraries. Note that when used to build a shared library, this will force all object files from your whole static libraries to be added to the final binary. This is not true when generating executables though.

不完全相同,但可以解决依赖问题。

在我的项目中,我创建了一个专用的 cpp 文件,它显式引用了有问题的符号。

auto i_reference_you =
{
    (void *)MyClass::some_symbol,
    (void *)some_other_symbol
};

这对我有用,因为只有几个符号。它并不优雅,但让我免于与构建系统作斗争。

关于android - 解决 Android makefile 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22060102/

相关文章:

android - 如何检测数据类 Kotlin 中更改的值?

android - 有没有一种简单的方法可以判断任意字符串在 Android 中是否是格式正确的 JSON?

java - SQLite识别长值

java - 内容 URI 和本地化

android - java.lang.UnsatisfiedLinkError : JNI_ERR returned from JNI_OnLoad

Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 找不到文件

java - Android AsyncTask 卡住了

Android NDK 支持版本有限

android - opengles2 glGenVertexArrays ... glGenVertexArraysOES