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