编译otad时缺少selinux.h的问题及解决
来源:互联网 发布:origin怎么导入数据 编辑:程序博客网 时间:2024/05/22 14:35
- 一 问题起因
- 二 问题分析
- 三 解决方案及总结
一 问题起因
为了在N上让updater能判断system分区是否出现了改动,我们需要把otad添加到N版本的miui中,仿照之前在m上的做法,manifest中添加otad,但是在编译阶段出现错误:
In file included from system/otad/commands.c:13:
bootable/recovery/minzip/Zip.h:21:10: fatal error: 'selinux/selinux.h' file not found
#include <selinux/selinux.h>
^
1 error generated.
二 问题分析
根据错误分析,在system/otad/commands.c中有:
#include "minzip/Zip.h"
在system/otad/Android.mk中有:
LOCAL_C_INCLUDES += bootable/recovery
因此在commands.c中include的Zip.h就位于bootable/recovery/minzip/Zip.h,在这个文件中直接include了selinux.h
#include <selinux/selinux.h>
根据C和C++中included的特性,include就相当于将这个文件完整包含进当前文件,因此这说明在编译system/otad/commands.c时直接引用到了selinux.h这个头文件。现在就是由于编译otad时找不到这个文件导致失败。
在Zip.h中也直接include了selinux.h这个头文件,我们看在编译minzip时是怎么解决这个问题的:
在minzip的Android.mk中并没有通过给LOCAL_C_INCLUDES直接赋值为selinux头文件所在位置的方式,而是在LOCAL_STATIC_LIBRARIES添加了libselinux的方式来解决包含selinux.h这个头文件的问题。
从这里我们可以推断,编译libminzip时需要编译libselinux,应该是在编译libselinux时得到了selinux.h的位置。
libselinux位于external/libselinux,观察它的Android.mk
可以发现其中有个LOCAL_EXPORT_C_INCLUDE_DIRS变量,取值为$(LOCAL_PATH)/include,它的作用就是将external/libselinux/include这个路径导出到out目录下编译模块的import_includes中,如果在ota的Android.mk中不添加libselinux,
编译otad出错后,进入到/out/target/product/cappu/obj/EXECUTABLES/otad_intermediates目录,可以发现import_includes文件的内容为
-I external/libcxx/include
-I external/libcxxabi/include
-I external/zlib
如果Android.mk中在LOCAL_STATIC_LIBRARIES中添加上libselinux,这时不但可以正常编译出otad,而且打开otad_intermediates目录下的import_includes,可以看到多出了selinux头文件的位置
-I external/libcxx/include
-I external/libcxxabi/include
-I external/zlib
-I external/libselinux/include
三 解决方案及总结
至此,我们可以找到解决这个编译失败的两种方案
1 在system/otad/Android.mk中将
LOCAL_STATIC_LIBRARIES := libminzip libz
改为
LOCAL_STATIC_LIBRARIES := libminzip libz libselinux
2 在system/otad/Android.mk中
LOCAL_C_INCLUDES += bootable/recovery
的下一行添加
LOCAL_C_INCLUDES += external/libselinux/include
这种方法相对手动一点,效果跟第一中相同,相当于将import_includes文件中-I external/libselinux/include的内容放到了LOCAL_C_INCLUDES中。
观察recovery和它下面的minzip的Android.mk,都采用的是添加libselinux的方法,因此推荐第一种方法。
最后,查看external/libselinux/Android.mk的提交历史,我们可以发现引入LOCAL_EXPORT_C_INCLUDE_DIRS是aosp官方的一个改动,之前采用的拷贝头文件的方式中,一个模块只需要包含selinux头文件而不需要依赖于selinux,这会引起依赖问题,因此之后改为了这种方式:
Author: Colin Cross <ccross@android.com> 2015-12-22 08:30:17
Committer: Colin Cross <ccross@android.com> 2015-12-22 08:30:17
Parent: 6d5e6edc21b1c41e815403a7ff9d8678642b744d (Use libpackageparser)
Child: 256ae129117f7d538290cb1968efd36104688aa1 (Move libselinux from libmincrypt to BoringSSL.)
libselinux: stop copying headers
Copying headers causes problems for dependency tracking, as any module
can include the copied header without depending on the module. Replace
LOCAL_COPY_HEADERS with LOCAL_EXPORT_C_INCLUDE_DIRS.
Change-Id: Ic3343fc6b8978d59d1ef48ebdb9a96470bb27232
---------------------------------- Android.mk ----------------------------------
index 25baae9..0e0d502 100644
@@ -41,20 +41,18 @@ common_HOST_FILES := \
src/label_support.c
-common_COPY_HEADERS_TO := selinux
-common_COPY_HEADERS := include/selinux/selinux.h include/selinux/label.h include/selinux/context.h include/selinux/avc.h include/selinux/android.h
-
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES) $(common_HOST_FILES) src/android.c
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_STATIC_LIBRARIES := libmincrypt
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre libpackagelistparser
# 1003 corresponds to auditd, from system/core/logd/event.logtags
LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003
# mapping.c has redundant check of array p_in->perms.
LOCAL_CLANG_CFLAGS += -Wno-pointer-bool-conversion
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_STATIC_LIBRARY)
@@ -69,22 +67,22 @@ LOCAL_SRC_FILES := $(common_HOST_FILES)
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_HOST_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES) $(common_HOST_FILES) src/android.c
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
-LOCAL_COPY_HEADERS_TO := $(common_COPY_HEADERS_TO)
-LOCAL_COPY_HEADERS := $(common_COPY_HEADERS)
LOCAL_STATIC_LIBRARIES := libmincrypt
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
LOCAL_SHARED_LIBRARIES := liblog libpcre libpackagelistparser
# 1003 corresponds to auditd, from system/core/logd/event.logtags
LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003
# mapping.c has redundant check of array p_in->perms.
LOCAL_CLANG_CFLAGS += -Wno-pointer-bool-conversion
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_SHARED_LIBRARY)
@@ -98,10 +96,9 @@ endif
LOCAL_SRC_FILES := $(common_HOST_FILES)
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
-LOCAL_COPY_HEADERS_TO := $(common_COPY_HEADERS_TO)
-LOCAL_COPY_HEADERS := $(common_COPY_HEADERS)
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_HOST_SHARED_LIBRARY)
#################################
- 编译otad时缺少selinux.h的问题及解决
- 编译otad时缺少selinux.h的问题及解决
- VS2008编译缺少atlrx.h的解决
- VS2008编译缺少atlrx.h的解决
- VS2008编译缺少atlrx.h的解决
- 解决缺少apue.h的问题
- 嵌入式开发的问题1──关于ppcboot编译缺少bfd。h(未解决)
- 针对缺少"streams.h"及配置directshow的问题的详细解决过程。
- 编译时,出现缺少 curl 问题的解决
- VS2008编译缺少atlrx.h的解决(转)
- 解决centos下缺少sasl.h的问题
- 解决ubuntu下缺少sasl.h的问题
- 怎样解决Qt编译出的程序运行时缺少libgcc_s_dw2-1.dll 文件的问题?
- 解决缺少streams.h的方法
- 关于VS2005编译wince Application 时缺少DLL问题的解决
- 编译时出现缺少 Python.h 错误
- AndroidStudio 缺少gradle版本的问题及解决
- MD5加密,缺少前置0的问题及解决
- Hrbust 1327 合唱【dp】
- poj2871 A Simple Question of Chemistry(水题)
- VS2010 main函数参数问题
- 第二天-中软!
- idea 快捷键,常用设置,插件安装,查看字节码
- 编译otad时缺少selinux.h的问题及解决
- Android 使用SVG
- 栈解旋unwinding
- HDU1560 DNA sequence 迭代深搜IDA*
- Hdu 3549 Flow Problem(最大流)
- 素数------有无穷多个素数(1)
- 王小二切饼
- Linux那点事
- 1.14