最近在Mac OSX上编译android 4.4.2的源码,碰到了N多问题,最头疼的就是在编译过程中遇到如下错误,网上搜索几天都不得解,后来终于搞清楚了:
1. 创建大小写敏感的磁盘镜像
在Mac下编译android的源代码需要一个大小写敏感(Case Sensitive)的分区格式如果你原来的分区不是HFS+一类大小写敏感的文件格式,那么最简单的办法就是新建一个这种分区格式的dmg出来,命令如下:
sudo hdiutil create -size 40g -type UDIF -fs HFSX -volname android /android.dmg
sudo chown $USER /android.dmg
然后打开Finder用鼠标双击/android.dmg,Mac系统将会自动加载android.dmg。在Finder 的右侧“Devices” 目录栏下你将会看到android.dmg磁盘,双击打开,把android 所有的源代码拷贝进去,当成文件夹使用就可以了。
2. 源码包解压缩:我拿到整个源码Zip包在Mac下面解压缩,然后复制到上面创建好的android.dmg磁盘,但是编译每次都是报下面的错误。折腾好半天,才搞明白原因:
(1)Android的源码文件名称是大小写敏感的,源码中有很多同名但仅大小写不一样的文件。当源码Zip包在Mac下直接解压缩时,由于Mac文件系统默认是不区分大小写的,解压出来的一些文件可能被重名的文件覆盖而丢失。下面的编译错误就是由于解压缩时xt_dscp.h 丢失了,只保留了xt_DSCP.h。因此必须将Zip包复制到android.dmg磁盘,再解压缩。
(2)另外对于Windows和Linux 系统也要注意:要使用linux的解压缩命令解压源码包。linux的文件系统和windows的文件系统不一样,linux对文件名称的大小写敏感,而windows不会,所以linux的源码包不能使用windows的解压工具解压缩,不然解压出来的一些文件可能被重名的文件覆盖而丢失。
target thumb C: libext <= out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:18:37: error: linux/netfilter/xt_dscp.h: No such file or directory
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:45: error: 'XT_DSCP_MAX' undeclared here (not in a function)
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:46: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:46: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c: In function 'dscp_parse':
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:60: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:60: error: request for member 'invert' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:63: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:63: error: request for member 'dscp' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:65: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:65: error: request for member 'invert' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c: In function 'dscp_print':
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:82: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:82: error: request for member 'invert' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:82: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:82: error: request for member 'dscp' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:82: warning: format '%02x' expects type 'unsigned int', but argument 3 has type 'const struct xt_option_entry *'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c: In function 'dscp_save':
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:90: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:90: error: request for member 'invert' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:90: error: dereferencing pointer to incomplete type
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:90: error: request for member 'dscp' in something not a structure or union
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:90: warning: format '%02x' expects type 'unsigned int', but argument 3 has type 'const struct xt_option_entry *'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c: At top level:
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:97: error: invalid application of 'sizeof' to incomplete type 'struct xt_dscp_info'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:97: error: invalid application of 'sizeof' to incomplete type 'struct xt_dscp_info'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:97: error: invalid application of 'sizeof' to incomplete type 'struct xt_dscp_info'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:98: error: invalid application of 'sizeof' to incomplete type 'struct xt_dscp_info'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:98: error: invalid application of 'sizeof' to incomplete type 'struct xt_dscp_info'
out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.c:98: error: invalid application of 'sizeof' to incomplete type 'struct xt_dscp_info'
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libext_intermediates/libxt_dscp.o] Error 1