我们有一个相当大的项目,为 Windows、Android 和 iOS 构建,我正在尝试并行化 android 构建。由于历史原因,在构建期间,所有 header 都导出到单个目录,并且它们的包含路径也基于此单个目录。这意味着如果模块 A 依赖于模块 B,那么它期望模块 B 复制出自己的 header 。
根据 NDK 文档,NDK make 脚本会忽略静态库之间的依赖关系,除了确定动态库的传递依赖关系之外,但由于我们只构建静态库,这对我们没有帮助。
我想我可以使用 LOCAL_EXPORT_C_INCLUDES
导出适当的路径,它会起作用,除了某些模块将 header 导出到与存储库中存在的 header 不同的路径下。
视觉辅助:
.
|-- Output
| |-- Android
| |-- includes/Foo/Bar
|-- Foo
| |-- Bar
| | |-- Android
| | | |-- stuff.h
| | |-- Windows
| | | |-- stuff.h
...
一个文件qux.cpp
将包含标题 stuff.h
如#include <Foo/Bar/stuff.h>
,一次有效 stuff.h
位于 Output
文件夹,但无法在stuff.h
时工作位于Foo/Bar/Android
最佳答案
毕竟,ndk-build 是 GNU make 的包装。这使您能够强制执行依赖关系。
这里我们将滥用ndk-build的PCH功能。如果您在库中使用 PCH,则需要不同的解决方法。
假设我们有两个静态库,libS2.a应该在libS1.a之后编译。您将对 Android.mk 文件进行一些修改:
…
include $(CLEAR_VARS)
LOCAL_MODULE := S1
LOCAL_SRC_FILES := …
include $(BUILD_STATIC_LIBRARY) # builds libS1.a
FIRST_LIBRARY := $(LOCAL_BUILT_MODULE) #### added #1
include $(CLEAR_VARS)
LOCAL_MODULE := S2
LOCAL_PCH := pch.h #### added #2
LOCAL_SRC_FILES := …
include $(BUILD_STATIC_LIBRARY) # builds libS2.a
$(LOCAL_PATH)/$(LOCAL_PCH): $(FIRST_LIBRARY) #### added #3
touch $@ #### added #4, starts with TAB
如您所见,我们只添加了 4 行。不要错过 touch
之前的 TAB 字符。
为了使这个技巧发挥作用,重要的是第一个库放置在第二个库之前。
关于android - 有没有办法强制 Android ndk 静态库之间的构建顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34250439/