【发布时间】:2016-10-20 15:48:47
【问题描述】:
我正在尝试为现有构建环境自动生成 Android.mk 文件。这个环境有许多相互链接的库,也可能链接到第 3 方库(如 boost)。
假设我有 libA 使用 boost。
我的目标是通过从 libB 文件夹运行 ndk-build 来构建 libA 和 libB。
所以我为libA 生成了这个Android.mk:
LOCAL_PATH := $(call my-dir)
# Import boost
include $(CLEAR_VARS)
LOCAL_MODULE := boost_atomic
LOCAL_SRC_FILES := ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a
include $(PREBUILT_STATIC_LIBRARY)
# libA:
include $(CLEAR_VARS)
LOCAL_MODULE := libA
LOCAL_SRC_FILES := libA.cpp
LOCAL_C_INCLUDES := ../dev/libcpp/boost/1.60.1
# boost import:
LOCAL_CPPFLAGS += -DHAVE_CONFIG_H -fexceptions -frtti
LOCAL_STATIC_LIBRARIES += boost_atomic
# build libA:
include $(BUILD_SHARED_LIBRARY)
现在我有libB 使用boost 和libA。 libB 的Android.mk 与libA 非常相似,只是我添加了libA 文件的导入,如下所示:
# Import libA
include $(CLEAR_VARS)
LOCAL_MODULE := libA
include ../../libA/jni/Android.mk
当我尝试制作libB 时,我被举报了:
Android NDK: Trying to define local module 'boost_atomic' in ../../libA/jni/Android.mk.
Android NDK: But this module was already defined by ../../libA/jni/Android.mk.
B:/Android/android-ndk-r11b/build//../build/core/build-module.mk:34: *** Android
NDK: Aborting. . Stop.
有没有办法让我检查boost_atomic 是否已经定义(如if (exists boost_atomic))以确保它只被定义一次?或者我应该为所有名称添加后缀(以boost_system_for_libA 和boost_system_for_libB 结尾)以防止冲突?还是有其他选择?
【问题讨论】:
-
是可以避免模块的重复定义,但在您的情况下,为了提升,简单地添加
LOCAL_LDLIBS += ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a而不是将其添加为 LOCAL_STATIC_LIBRARIES 会更容易跨度> -
@AlexCohn:将是一个很好的解决方案。明天试试。我可以对共享库做同样的事情吗?因为我想如果有
libC使用libB和libA,我会遇到同样的问题,libA最终将被定义两次(由libB和libC导入)当我编译时libC. -
不,这不适用于非预建库,并且无论如何不应在 LDLIBS 中指定共享库。但通常很容易根据子目录的层次结构包含您的 Android.mk 文件。这样可以避免重复。
-
@AlexCohn:谢谢,
LOCAL_LDLIBS += ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a会给non-system libraries in linkerwarning。如何摆脱这个警告? (简单地尝试了LOCAL_STATIC_LIBRARIES += ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a,但它不起作用)。 -
您可以忽略此警告。它仅与共享库相关。
标签: android c++ android-ndk