2

我们正在开发一个项目,我们需要从静态库创建一个共享库。我们面临的问题是静态库包含循环依赖。以下是我的 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。

4

1 回答 1

3

-Wl,--start-groupLOCAL_STATIC_LIBRARIES中指定的内容似乎被忽略了。

曾经有 LOCAL_GROUP_STATIC_LIBRARIES 将静态库与-Wl,--start-group链接-Wl,--end-group时进行分组。

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

当几个静态库之间存在循环依赖关系时,这通常很有用。请注意,当用于构建共享库时,这将强制将整个静态库中的所有目标文件添加到最终二进制文件中。但是,在生成可执行文件时情况并非如此。

不完全一样,但可以解决依赖问题。

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

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

这对我有用,因为只有几个符号。这一点都不优雅,但让我免于与构建系统抗争。

于 2015-01-30T05:22:10.963 回答