如何去除Android Makefile中重复的LOCAL_C_INCLUDES路径?
Android Makefile 去除LOCAL_C_INCLUDES重复路径的方法
针对Android Makefile中LOCAL_C_INCLUDES路径重复的问题,完全可以借助GNU Make的内置函数或自定义函数解决,以下是几种实用方案:
1. 直接使用内置sort函数去重
GNU Make的sort函数不仅会对路径列表排序,还会自动去除重复项,这是最简单高效的方式:
# 原始重复路径 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include $(LOCAL_PATH)/src ../moduleA/include $(LOCAL_PATH)/include ../moduleA/include # 用sort去重 LOCAL_C_INCLUDES := $(sort $(LOCAL_C_INCLUDES))
处理后重复的路径会被自动剔除,同时路径按字母排序,不会影响编译逻辑(除非你依赖路径的查找优先级,这种情况需额外注意)。
2. 封装自定义可复用函数
如果多个模块都需要去重操作,可以封装一个自定义函数,方便统一调用:
# 定义去重函数 define uniq-includes $(sort $(1)) endef # 在模块中调用 LOCAL_C_INCLUDES := $(call uniq-includes, $(LOCAL_PATH)/include ../moduleB/include $(LOCAL_PATH)/include)
3. 从根源减少重复:用LOCAL_EXPORT_C_INCLUDES传递路径
如果重复是因为子模块引用导致的,建议在子模块中使用LOCAL_EXPORT_C_INCLUDES导出头文件路径,主模块依赖子模块时会自动继承这些路径,无需手动重复添加:
# 子模块的Android.mk LOCAL_MODULE := sub_module LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include # ...其他子模块配置 # 主模块的Android.mk LOCAL_MODULE := main_module LOCAL_STATIC_LIBRARIES := sub_module # 无需手动添加sub_module的include路径,会自动继承 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src $(sort $(LOCAL_C_INCLUDES))
注意事项
sort是GNU Make内置函数,Android构建系统基于GNU Make,完全兼容。- 若路径顺序影响头文件查找优先级(比如不同路径下有同名头文件),可以自定义循环去重函数(但
sort仍是绝大多数场景的最优选择)。
内容的提问来源于stack exchange,提问作者Yakov Dan
相关产品推荐
相关产品推荐

