正确姿势解决Android源码编译Werror类型错误

      正确姿势解决Android源码编译Werror类型错误



前言

  在Android源码环境下通过Android.mk或者Android.bp编译Native源码的时候,由于源码编译选项越来越严格,特别是Android O平台以后,默认编译选项都使用了-Wall -Werror 字段(Android O以前也会存在相关的问题)。所以经常会出现如下的编译错误,今天我将带领读者一步步的来解决如上问题。
在这里插入图片描述



前期知识准备

在正式开始解决前,然我们先磨磨刀,磨刀不误砍柴工吗,一步一步来,方得始终吗。

1.1 啥是-Wall和-Werror字段

这个没有啥多少的,人狠话不多直接上解释:

  • Wall:编译阶段显示所有警告。
  • Werror:将所有的警告当成错误进行处理,使出现警告时就停止编译,这种错误是最常见的。

1.2 LOCAL_CFLAGS

LOCAL_CFLAGS是Android.mk中定义的一个编译选项,其可以根据后续添加的选项不同,分为如下几个用途,下面让我们一起总结一下:

  • -D选项,相当于添加宏定义
LOCAL_CFLAGS += -DXXX   相当于在所有源文件中增加一个宏定义#define XXX
  • 代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化,这个不在本章的讨论范围之内。
  • -W[no-]<警告选项> no- 表示诊断时忽略这个警告 ,这个是本章的重点地方,划重点了,给位仔细留意啊。

编译器的警告设置参数,拥有众多的选项,下面举一些常用的例子:


 -Woption 让编译器给出option指定的编译警告,常用的一些如下:
				unused-function: 遇到仅声明过但尚未定义的静态函数时发出警告。
				unused-parameter: 从未用过的函数参数的警告。
				unused-variable: 在本地声明但从未用过的变量的警告。
				unused-value: 经计算但从未用过的值得警告。
				return-type: 对函数返回类型不当的警告。
				uninitialized:在初始化之前就使用自动变量。
				float-equal:   比较两个浮点数是否相等。
-Wall  给出“几乎”所有的编译器警告,注意是“几乎”。下面是一些-Wall没有输出的警告类型:
				sign-compare:将有符号类型和无符号类型数据进行比较时发出警告。
				unreachable-code:如果发现从未执行的代码时给出警告。
				inline:如果某函数不能按要求内嵌(inline),则无论是函数声明为inline或者是指定了-finline-functions 选项,编译都将发出警告。      
-Werror   把所有的警告都视为错误处理。
-Wno-option     如果我们不想输出某些警告信息,可以使用此参数形式,比如:LOCAL_CFLAGS := -Wno-unused-parameter


正式开干

前期知识准备好了,砍刀也磨好了,此时不动手更待何时啊,兄弟们上。先看具体案例,一一分析:

.paxdroid_origin/external/pax/lib/libiconv/lib/ucs4be.h:35:23: error: unused parameter 'conv' [-Werror,-Wunused-parameter]
ucs4be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
                      ^
In file included from .paxdroid_origin/external/pax/lib/libiconv/lib/iconv.c:70:
In file included from .paxdroid_origin/external/pax/lib/libiconv/lib/converters.h:125:
.paxdroid_origin/external/pax/lib/libiconv/lib/ucs4le.h:25:23: error: unused parameter 'conv' [-Werror,-Wunused-parameter]
ucs4le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
                      ^
.paxdroid_origin/external/pax/lib/libiconv/lib/ucs4le.h:35:23: error: unused parameter 'conv' [-Werror,-Wunused-parameter]
ucs4le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
                      ^
In file included from .paxdroid_origin/external/pax/lib/libiconv/lib/iconv.c:70:
In file included from .paxdroid_origin/external/pax/lib/libiconv/lib/converters.h:127:
.paxdroid_origin/external/pax/lib/libiconv/lib/utf16be.h:27:24: error: unused parameter 'conv' [-Werror,-Wunused-parameter]
utf16be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
                       ^
.paxdroid_origin/external/pax/lib/libiconv/lib/utf16be.h:54:24: error: unused parameter 'conv' [-Werror,-Wunused-parameter]
utf16be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
                       ^
In file included from .paxdroid_origin/external/pax/lib/libiconv/lib/iconv.c:70:
In file included from .paxdroid_origin/external/pax/lib/libiconv/lib/converters.h:128:
.paxdroid_origin/external/pax/lib/libiconv/lib/utf16le.h:27:24: error: unused parameter 'conv' [-Werror,-Wunused-parameter]
utf16le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)

2.1 简单粗暴式

这个方式,不是很推荐,作为纯爷们的我们怎么能干粗暴的事情呢,但是为了读者,我还是得演示一番,良苦用心啊。(当然是把源码按照规范写,这样是最好的了)。这里我以Android 7版本为说明,Android 8由于默认编译的已经修改了成soong,门道还有点生疏。
主要是修改源码目录下的 build/core/config.mk的配置选项,修改逻辑如下:

tangkw@pd:~/ssd/A920_7.1.1/ap$ git diff build/core/config.mk 
diff --git a/build/core/config.mk b/build/core/config.mk
index 61520605b6..eddee21816 100644
--- a/build/core/config.mk
+++ b/build/core/config.mk
@@ -665,7 +665,8 @@ GLOBAL_CLANG_CFLAGS_NO_OVERRIDE := \
 GLOBAL_CPPFLAGS_NO_OVERRIDE :=
 
 # list of flags to turn specific warnings in to errors
-TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=date-time
+//TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=date-time
+TARGET_ERROR_FLAGS := 
 
 # We run gcc/clang with PWD=/proc/self/cwd to remove the $TOP
 # from the debug output. That way two builds in two different
tangkw@pd:~/ssd/A920_7.1.1/ap$ 

在这里插入图片描述
上述的方法太简单残暴了,这个是我不能接受的,不能妥协的。这就好像头疼吗,好吗,头我不要了。太残暴了。


2.2 治本不治标式

前面的方法不好,下面来点比较靠谱的方法(当然最靠谱的就是严格按照编译规范编写代码),就是LOCAL_CFLAGS 中增加编译器的警告设置参数,这里我们如下错误说明:

error: unused parameter 'conv' [-Werror,-Wunused-parameter]
error: data argument not used by format string [-Werror,-Wformat-extra-args]

具体步骤如下
在该Native中的Android.mk中添加如下编译选项:

LOCAL_CFLAGS +=  -Wno-unused-parameter \
				 -Wno-format-extra-args

其它的依次类推,直到编译OK为止。


2.2 治本治标式

前面的方法还是不太美,那么治本治标的方法是啥呢,那就是严格按照编译器规范编写,不留一丝丝机会给编译器报错。好吗,臣妾做不到啊。



结语

修行至此,恭喜读者你已经对Android源码编译Werror类型错误的弱点了然于心了,行走于Android编译江湖木有任何问题了。此时的你可以一剑走天下了,为师的必杀器已经倾囊相授了。各位江湖见。



写在最后

  各位读者看官朋友们,正确姿势解决Android源码编译Werror类型错误,希望能吸引你,激发你的学习欲望和斗志。在最后麻烦读者朋友们如果本篇对你有帮助,关注和点赞一下,当然如果有错误和不足的地方也可以拍砖。

发布了93 篇原创文章 · 获赞 96 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/tkwxty/article/details/104018279
今日推荐