换了一台机器编译openharmony,记录编译过程中遇到的错误及解决方法。
FALLTHROUGH错误
编译过程第三方库编译报错。查看日志,是因为配置了-Werror=implicit-fallthrough编译选项,导致原先的警告被作为错误处理。几种修改方案:
- 库的编译选项取消该选项
- 使用pragma
#pragma GCC diagnostic push /* 入栈当前编译选项 */
#pragma GCC diagnostic ignored "-Werror=implicit-fallthrough" /* 忽略FALLTHROUGH错误选项 */
foo(b); /* 忽略FALLTHROUGH错误选项的代码段 */
#pragma GCC diagnostic pop /* 弹出原编译选项 */
上述方法,同样适用于其他类似的临时忽略某些编译选项的场合。
- 使用 atttribut
在需要FALLTHROUGH的代码,原先写break的位置加上__attribute__((fallthrought));
case 1:
foo1();
__attribute__((__fallthrought__)); /* 注意是两个括号 */
case xxx:
...
Missing seperation, stop错误
网上搜了很久,有很多答案。
- dash未修改为bash
解决方案:
sudo dpkg-reconfigure dash #选择 NO
检查shell软链接,没有问题。
-
Makefile格式中缩进使用空格对齐或TAB,文件中有非ASC字符的问题
解决方案:编辑makefile,排除以上问题
看了一下出错的工程makefile,缩进使用的是空格,但是编译通过的工程,也是同样的格式,基本可以排除这个问题。 -
ninja、gn工具链和python版本的问题
解决方案: 修改python、python3的链接目标,或这使用python版本管理工具
检查了python, python3都指向相同的位置,和编译命令中的python位置是一致的的,基本可以排除此问题。 -
缺少可执行文件或库
解决方案:安装对应的程序,并增加到$PATH,具体的问题需要从编译日志中排查。
具体到此次的问题,错误日志
makefile 40 missing separator.stop:
...
上下文中没有明显的缺少内容的提示,这也是一开始没有往这方面考虑的主要原因。实在没办法了,才又回到原点,查看出错的makefile,对应上述信息的位置
$(foreach line,$(shell hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g' || true),$(eval $(line)))
其中有用到“hb env”。于是,赶紧看了一眼,赫然显示
Necessary package: bison, ccache, default-jdk, flex, ...
Installed package: bison, ccache, flex, ...
Uninstalled package: default-jdk, ...
按照以上要求,安装所需包,重新编译,通过。
本来官方编译环境搭建中,有要求安装上述库和程序,比如scons,但是在使用IDE中,这些库需要在IDE中重新再安装一遍。因此在搭建编译环境的过程中特意跳过了这几重复安装包,没想到就在这里翻车了。
关于Makefile的几个函数
上面的Makefile语句中用到了几个函数,简单记录一下涉及上述内容的用法。
foreach用法
遍历列表成员
foreach var, list,do
遍历列表list里面的每一个成员,用var代表,使用do对meige var完成操作。
sed 用法
查找替换,这里用管道操作代替了文件名
sed 's/old/new/g;s/old1/new1/op2' filename
sed 选项 ‘条件格式指令;条件格式指令’ 文件名,此处使用了替换指令s,查找全部(/g) old替换为new
eval 用法
把文本当做makefile指令执行
eval text
把text当做Makefile命令进行执行
通过所上述的Makefile指令,重新赋值了一些变量。
ohos_Necessary_package=bison,...
ohos_Installed_package=bison,...
ohos_Uninstalled_package=
ohos_root_path=...
ohos_board=...
ohos_kernel=...
ohos_product=...
ohos_product_path=...
ohos_device_path=...
ohos_device_company=...