我们有一个相当大的项目,为Windows,Android和iOS构建,我正在尝试并行化android构建。由于历史原因,在构建期间,所有标头都将导出到单个目录,其包含路径也基于此单个目录。这意味着如果模块A依赖于模块B,那么它期望模块B复制出自己的标头。
根据NDK文档,除了确定动态库的传递依赖性之外,NDK make脚本忽略了静态库之间的依赖关系,但由于我们只构建静态库,这对我们没有帮助。
我以为我可以使用LOCAL_EXPORT_C_INCLUDES
来导出适当的路径,除非有些模块在不同的路径下导出标头而不是存储库中存在标头。
Visual Aid:
.
|-- 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
文件夹中,但{{1}时无法正常工作在stuff.h
答案 0 :(得分:1)
毕竟, 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字符。
要使这个技巧起作用,重要的是第一个库放在之前第二个。