记录交叉编译qt时踩到的一个坑:工具链版本要保持一致。

工具链是什么

         在电脑端编译开发板上的程序时,需要使用交叉编译器,比如我常用的arm-linux-gnueabi-gcc编译器,就属于arm-linux-gnueabi工具链。这个工具链内包含一系列以arm-linux-gnueabi-开头的软件,比如g++ ar as等等等等,以及其自带的一堆交叉编译时使用的动态库及头文件。

 

       在ubuntu上只需要运行一句apt install gcc-arm-linux-gnueabi,就会把工具链内的这一系列软件,以及头文件动态库全都安装好,这些是一个整体。

版本不同会怎样

        之前我就踩过一个坑,商家提供的一个uboot驱动用交叉编译器6.x版本编译就可用,而我电脑的版本是7.x,uboot内只要启用这个驱动,开发板就会无限重启。

         现在踩了第二个坑,现象是:在电脑端使用arm-linux-gnueabi-gcc动态编译出的程序,在开发板内运行就会报错 文件 not found。

        因为buildroot在编译rootfs时,使用的不是我上图arm-linux-gnueabi-gcc所属的工具链,两个工具链使用的头文件动态库不同。导致在编译可执行文件时,编译器设置运行时要调用动态库中的xxx,到了在开发板上运行时,却找不到这个xxx。

        同样,如果在交叉编译qt时选用arm-linux-gnueabi工具链,那么用交叉编译出的qmake,去编译自己的qt项目,最后生成的可执行文件会像上面那样,报错not found。

         而要解决这个编译出的程序not found问题的方法有两个:一个是在交叉编译时加-static进行静态编译,就不需要使用开发板上的动态库;另一个,就是使用编译rootfs的那个工具链中的交叉编译器。

设置buildroot用的哪个工具链

         让我们回到buildroot的路径下,输入make menuconfig命令进入设置,进入 > Toolchain下的Toolchain type选项,选择交叉编译器是用内部还是外部的。

         如果你选择external toolchain,则在> Toolchain下可以设置选用本地安装的工具链,具体设置项这里就不细介绍了(懒得写)

        如果选择buildroot toolchain,则在后面编译rootfs时,他会自动下载交叉编译器源码,自己编译出一套工具链,然后用这套自制工具链来交叉编译rootfs

         当然,在> Toolchain下可以设置要制作什么版本的工具链。

        buildroot的自制工具链路径位于  buildroot目录/output/host/usr/bin,后续也可以直接使用这个工具链去编译自己的项目。

 

交叉编译qt时怎么设置工具链

         确保与buildroot使用的是同一个工具链,否则会因为动态库版本不同导致编译出来的文件直接不可用。

         目前几乎所有qt交叉编译教程其实都会叫你改交叉编译器,只要修改文件qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf内几个变量的值就行。

         比如我想使用buildroot生成的工具链来交叉编译qt,只需要修改成如下即可。(这路径有点长,可以通过加进环境变量的方式省去)

Logo

更多推荐