问题所述:
在虚拟机Ubuntu中,对qt的代码进行 make 编译的时候报错了:fatal error: sys/cdefs.h: No such file or directory
问题分析:
目前推测的是:1、qt的版本混乱所导致的 2、可能编译arm的程序时,交叉编译环境没有配置好
首先:
默认版本是 Qt 4.8.7
arm的版本是Qt 5.12.2 (看红色知道这个配置有点儿问题)
最后是昨天刚下载的一个 qt5-default ,版本是qt 5.9.5
提醒:qt-default:是Qt 4.8.7 ;而 qt5-default ,是 Qt 5.9.5 (之前下载时没注意,所以会出现几种库版本)
注意:qtcreator是一个IDE,qt5-default 是一个库。事实上往往分别安装了两个之后都要在 qtcreator 的 tool-option里面设置编译链的位置。编译的时候相当于ide自动帮你调用qmake-make。
问题解决:
第一步,先解决推测的第二种可能,把arm的交叉编译环境给配置好。
先查找arm的交叉编译链
sudo apt-cache search aarch64
可以通过在命令行输入 aa
加上 Tab
键,查看自己需要的是哪种版本
然后安装:
sudo apt-get install g++-7-aarch64-linux-gnu
sudo apt-get install gcc-7-aarch64-linux-gnu
安装完成后,可以去qtcreator上查看:
然后就发现arm的不报错了(注意:这个arm是之前自己Add的,名字自己起的,为了区分其他版本)
编译程序,还是缺少了 g++编译器
查询一下,然后再安装上去(如果也缺少了gcc编译器,也可以一起安装上去):
sudo apt-get install g++-aarch64-linux-gnu
安装完成后,再去查看qtcreator里面的编译器,这下子补全了:
去 /usr/bin
目录下查看它们的关系:
然后,再去编译程序(先Clean
,再 Rebuild
的),发现顺利编译成功
去命令行窗口试一试,发现也是
然后找其中的一个程序运行,报了一个 libstdc++.so.6 共享库找不着:
那咱们就通过命令行检索一下:
sudo find / -name libstdc++.so.6
发现了一个小问题,aarch64-linux-gnu
本应该是在/usr/lib
下的,这个位置着实看着不对:
/usr/aarch64-linux-gnu/lib/libstdc++.so.6
然后我先不管。先添加缺少的库(直接在pro文件下指定路径):
结果发现,还是缺少相应的库,原因是aarch64-linux-gnu
这里面需要的库都没有。
既然如此,那我就干脆尝试把这个aarch64-linux-gnu
直接变换的/usr/lib
下,然后再从x86_64-linux-gnu
中拷贝需要的库到aarch64-linux-gnu
中。
或者呢,将原本是aarch64-linux-gnu
下的 lib
文件夹改名为 aarch64-linux-gnu
,再将 aarch64-linux-gnu
移动到 /usr/lib
下(其目的是能保证那些软连接符号拷贝过去都能正常使用):
然后进入到/usr/lib/aarch64-linux-gnu
目录下,可以将所需要的库文件一个一个从x86_64-linux-gnu
里面拷过来:
后面再运行qt程序即可成功。
其他:
可以查看自己系统的qmake用的是哪种版本:
如果想要修改默认的qt版本,可以去default.conf
下修改:
将这两行修改为安装qt的目录即可: