我们正在开发一个项目,我们需要从静态库创建一个共享库。我们面临的问题是静态库包含循环依赖。以下是我的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。
答案 0 :(得分:2)
似乎忽略了LOCAL_STATIC_LIBRARIES中指定的-Wl,--start-group
。
使用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
};
这对我有用,因为只有几个符号。它没什么优雅的,但是让我免于与构建系统作斗争。