问题
之前项目的Qt应用需要适配龙芯4000,龙芯4000使用的是mips架构,Qt环境的搭建基本上很顺利完成。但龙芯5000不是基于mips架构,是全新的指令集,据说效率相比mips提升了不少。全新的指令集,那意味着要重新编译Qt环境,按往常的编译步骤进行操作,然后就出问题了
报错如下
error: #error Target architecture was not detected as supported by Double-Conversion.
字面意思大概是当前的系统架构不支持Double-Conversion
百度一圈都没有这个错误的问题,Google倒是挺多的,不过也不是编译Qt出现的
解决思路
报错的文件为qtbase/src/3rdparty/double-conversion/include/double-conversion/utils.h
打开这个头文件,找到报错的信息
是由于龙芯5000是全新的指令集,上面定义的宏并没有该架构,可以看到常见mips、aarch、alpha等,所以问题就出在这里,那是不是添加龙芯5000架构的宏就可以了?想是这么想,那就加上试试。
使用命令查看操作系统内核信息
uname –a
Linux hedy-PC 4.19.0-loongson-3-desktop #3208 SMP Sun Jun 13 14:47:22 CST 2021 loongarch64 GNU/Linux
架构为loongarch64
在defined(__mips__) ||后添加宏
defined(__loongarch__)
重新编译make,发现就可以了!!!
一开始在defined(_MIPS_ARCH_MIPS32R2)后面添加,发现不行,在defined(__mips__)后添加就通过,不清楚是啥情况。另外使用defined(__loongarch64__)印象中好像也是不行,很懵圈,完全是试出来的。
这其中经历很多波折一步一步才找到这个解决方法,这也是比较表面的修改,其中的原理没有太深究,至于有没有其他隐患就不是很清楚了,反正是编译通过了。
其他思路
这其中尝试了其他的解决思路,Double-Conversion是Qt依赖的第三方库,那是不是可以配置不依赖其进行编译?没错,还真有这个配置。
./configure可以进行配置
-no-doubleconversion Use sscanf_l and snprintf_l for (imprecise) double con version.
-qt-doubleconversion Use the libdouble-conversion bundled with Qt.
-system-doubleconversion Use the libdouble-conversion provided by the system.
采用-no-doubleconversion方式配置发现无法完成配置,makefile无法生成,提示sscanf_l and snprintf需要依赖libdouble-conversion,这条路是走不通了,我有点好奇这个配置项有什么用,提供可以不链接,但是配置了又通不过。
默认是使用qt源码中自带的,也可以依赖系统中安装的,qt源码中编不过那用系统的也可以。安装libdouble-conversion,发现没有现成的包,如果你所使用的系统有现成的包能够直接安装,那配置依赖系统的中库理论上也是可以解决的。
其实如果没有相应的包,使用libdouble-conversion源码进行安装,其实和qt带的源码是一样的。当然独立编译安装libdouble-conversion可以排除其他因素,更容易找到问题,我也是编译libdouble-conversion的时候发现在那个位置加上宏就可以了。
附带libdouble-conversion源码下载及安装说明,点击这里