一、前情提要
最近工作又要开始搞PX4的开发,正好读研时有现成的环境(Ubuntu18.04LTS),本着能不折腾就不折腾的原则,直接下载了最新版本的PX4源码进行编译测试(v1.16.0-alpha2-84-g091974e6c5),随便编了个版本(px4_fmu-v3_default)结果编译报错,报错内容如下:
/PX4-Autopilot/platforms/nuttx/NuttX/include/cxx/cmath:60:13: error: conflicting declaration of C function 'bool std::isfinite(double)'
inline bool isfinite(double value) { return __builtin_isfinite(value); }
^~~~~~~~
试了老代码(v1.11)编译是ok的,所以怀疑可能是编译器的问题。多方查找解决办法并尝试,终于解决,现把解决办法分享出来以供大家参考。
二、解决办法
一言以蔽之:就是检查编译器太老了,更新即可!
在谷歌上搜索找到相同报错,这个老哥一语道破:
可以使用:
arm-none-eabi-gcc -v
查看环境中的交叉编译工具版本号,发现版本为:
gcc version 7.2.1 20170904 (release) [ARM/embedded-7-branch revision 255204] (GNU Tools for Arm Embedded Processors 7-2017-q4-major)
还是2017时的版本,确实比较老了。顺着这个思路,去更新交叉编译器即可,至于如何更新,可以参考这个老哥的帖子,写的很好:
【PX4-AutoPilot教程-TIPS】Ubuntu中安装指定版本的gcc-arm-none-eabi
我把简要步骤介绍如下。
三、更新gcc-arm-none-eabi简要步骤
下载新版gcc-arm-none-eabi
官网下载:https://developer.arm.com/downloads/-/gnu-rm,以10.3-2021.10版本为例:
1、将下载好的软件包放在Desktop桌面,使用命令将其移动到opt文件夹
sudo mv ~/Desktop gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 /opt
2、解压下载的软件包
cd /opt
sudo tar -vxf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
3、安装环境依赖包
$ sudo apt-get install lsb-core
$ sudo apt-get install lib32ncurses5 lib32tinfo5 libc6-i386
4、添加环境变量到.profile 文件
sudo vim ~/.profile
4、添加环境变量到.profile 文件
sudo vim ~/.profile
在文件的最后一行空白处添加一行代码,保存后关闭。
5、更新环境变量
source ~/.profile
6、检查是否更改成功
arm-none-eabi-gcc -v
如图所示,gcc版本号与所安装的交叉编译工具版本号一致,说明更新成功。
四、make clean后重新编译新版PX4代码
可以看到编译成功了!