Android.如何检查一个模块是否已经存在
Android.mk: How to check if a module already exists
我正在尝试生成Android。Mk文件自动用于现有的构建环境。这个环境有许多库相互链接,也可能链接到第三方库(如boost)。
假设我有libA
使用boost。我的目标是通过从libB文件夹运行ndk-build来构建libA
和libB
。
生成这个Android。mk for libA
:
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
结尾)以防止冲突?或者有其他选择吗?
您有一个NDK函数$(modules_get_list)
。依靠它,你的libA/jni/Android。mk文件可能如下所示:
LOCAL_PATH := $(call my-dir)
include ../../boost/Android.mk
# libA:
include $(CLEAR_VARS)
LOCAL_MODULE := libA
LOCAL_SRC_FILES := libA.cpp
# boost import:
LOCAL_STATIC_LIBRARIES += boost_atomic
# build libA:
$(if $(call set_is_member,$(modules-get-list),$(LOCAL_MODULE)),
,$(eval include $(BUILD_SHARED_LIBRARY)))
和增加/Android。可文件:
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
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../dev/libcpp/boost/1.60.1
LOCAL_EXPORT_CPPFLAGS += -DHAVE_CONFIG_H -fexceptions -frtti
$(if $(call set_is_member,$(modules-get-list),$(LOCAL_MODULE)),
,$(eval include $(PREBUILT_STATIC_LIBRARY))
最后,libB/jni Android.mk :
LOCAL_PATH := $(call my-dir)
include ../../boost/Android.mk
include ../../libA/jni/Android.mk
# libB:
include $(CLEAR_VARS)
LOCAL_MODULE := libB
LOCAL_SRC_FILES := libB.cpp
# boost import:
LOCAL_STATIC_LIBRARIES += boost_atomic
# build libA:
$(if $(call set_is_member,$(modules-get-list),$(LOCAL_MODULE)),
,$(eval include $(BUILD_SHARED_LIBRARY)))
我不喜欢第三方预构建库的重复定义,比如boost,而是使用单独的Android。mk定义,并在必要时使用include
。这样,如果外部库更新了,我就有一个地方可以更改。
更新:如果你不喜欢$(if …)
语法,你可以使用
ifeq ($(filter $(modules-get-list),$(LOCAL_MODULE)),)
include $(BUILD_…_LIBRARY)
endif
。
正如Alex Cohn所提到的,可以通过替换:
include $(CLEAR_VARS)
LOCAL_MODULE := boost_atomic
LOCAL_SRC_FILES := ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a
include $(PREBUILT_STATIC_LIBRARY)
...
# boost import:
LOCAL_CPPFLAGS += -DHAVE_CONFIG_H -fexceptions -frtti
LOCAL_STATIC_LIBRARIES += boost_atomic
由简单:LOCAL_LDLIBS += ../dev/libcpp/boost/1.60.1/lib/libboost_atomic.a
可以,但是:
引入编译警告:
警告:/用户/jwalton/Android-CryptoPP/jni/Android.mk: prng:链接器标志中的非系统库:-lcryptopp -lstlport_shared
这很可能导致不正确的构建。尝试使用LOCAL_STATIC_LIBRARIES
类的库依赖项当前模块不能用于共享第三方库
所以我终于解决了这个问题,我添加了一个新的mk文件特定于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)
include libA.mk
libA
的libA.mk
是现在:
LOCAL_PATH := $(call my-dir)
# libA:
include $(CLEAR_VARS)
LOCAL_MODULE := libA
LOCAL_SRC_FILES := libA.cpp
LOCAL_C_INCLUDES := ../dev/libcpp/boost/1.60.1
# boost link:
LOCAL_CPPFLAGS += -DHAVE_CONFIG_H -fexceptions -frtti
LOCAL_STATIC_LIBRARIES += boost_atomic
# build libA:
include $(BUILD_SHARED_LIBRARY)
libB
的libB.mk
现在有:
# Import libA
include $(CLEAR_VARS)
LOCAL_MODULE := libA
include ../../libA/jni/libA.mk
使其导入libA
而不导入boost
(也在libB
的Android.mk
中定义)。
我正在尝试生成Android。Mk文件自动为已存在的构建环境。这个环境有许多库链接到每个库其他也可能链接到第三方库(如boost)。
为什么不使用独立的NDK工具链,而不是痛苦地处理Android.mk
文件?听起来独立的工具链非常适合您的情况。
- C++模板来检查友元函数的存在
- 尝试导入pybind-opencv模块时出现libgtk错误
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 如何检查QList中是否存在值
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 根据某个函数是否存在启用模板
- Android.如何检查一个模块是否已经存在