银河麒麟(V10SP1)-arm版交叉编译-qt-5.12.12源码

前言

确实是编译出来了qtbase库和qtwebengine库,如果按照文章没有操作出来有两种情况

(1) 读者阅读不仔细

(2) 我后期记录整理时写错了


不完美之处和遗留问题

读者阅读前须知

1. 最后发现没有生成libqxcb库文件,如果在国产化系统上执行qt程序时依赖的是自己编译出来的qt库文件,会提示找不到xcb,那这样编译出来的qt程序只能使用国产化系统上的qt库,感觉这种做法使得交叉编译的意义不大了,我尝试去编译libqxcb库文件,但可能是依赖路径没找对,./configure执行都没通过,又尝试了几遍还是没有头绪,所以留下这个问题

我自己在本地编译qt源码时也遇到过但是很轻松就解决了

解决qt5.12.12编译源码没有libqxcb的问题-CSDN博客

2. 编译过程中需要多次修改LISB,增加需要的依赖库,应该是./configure需要配置某些参数

当然读者也可以在这篇文章的基础上去进一步研究,如果解决了这两个问题,希望能告诉我,非常感谢


交叉编译思路

交叉编译,就是在x86本地环境下载编译出能在arm环境下运行的程序,我这里的思路就是先用虚拟机搭建一个x86本地环境,然后在虚拟机中部署一个arm根文件系统,用交叉编译链工具在x86本地环境下编译qt源码,需要的库文件就从根文件系统中查找使用


虚拟机配置

虚拟机内存设置10G以上,我观察编译qtwebengine的时候,内存消耗会达到9G,所以内存要多设置一些,核心数设置四个以上比较好,磁盘控件设置60G左右就行了


glibc版本的匹配

交叉编译首先就是要确保,编译出来的程序是可以在目标环境上运行的,所以要保证可以使用目标环境上的glibc库,当前系统使用的glibc库的版本可以使用下面的命令获取

            lzq@lzq-VirtualBox:~/forQt/debian-11-linux-rootfs/qtbuild$ ldd --version

            ldd (Ubuntu GLIBC 2.39-0ubuntu8.2) 2.39
            Copyright (C) 2024 Free Software Foundation, Inc.
            This is free software; see the source for copying conditions.  There is NO
            warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
            Written by Roland McGrath and Ulrich Drepper.    

交叉编译出来的程序匹配的glibc版本与arm根文件系统版本有关,所以在选择arm根文件系统时需要注意与目标环境glibc的版本匹配


arm根文件系统的选择

下文会介绍arm根文件系统的部署方法,这里我先记录一下我已经使用过的arm根文件系统版本

arm根文件系统使用结果
ubuntu24.04可以编译出qtbase库和webengine库,但是glibc版本太高,为2.39,目前嵌入式和国产化系统的版本没有这么高,所以没有普适性
ubuntu18.04~ubuntu22.04使用包管理器无法安装某几个关键的库(例如 gperf),即使编译源码安装上也是有版本问题,依赖的库是一层套一层,太麻烦了,所以放弃
debian11glibc版本是2.31,这是目前国产化操作系统银河麒麟SP1支持的glibc版本,这就很匹配,我的目标也是要适配银河麒麟SP1
debian11或者ubuntu18.04一下的版本按照以上规律,glibc版本逐渐下降,但这些系统我没有尝试,搭建一个环境太麻烦了,读者有兴趣可以试试

本地x86环境的系统版本也要和arm根文件系统一致,这样glibc版本都一样,减少奇怪的兼容问题


qt源码版本的选择

一般交叉编译都是用在嵌入式开发上,所以qt版本也不会选太高,我这是使用的是qt5.12.12版本,和公司使用的版本匹配

版本也试过,qtwebengine模块又加了一些新东西,还需要增加额外的环境配置


搭建根文件系统

在本地x86环境下搭建arm的根文件系统,主要就是为了获取支持arm架构的库文件,其实也可以从目标机上拷贝下来放到本地x86环境中的,但是后期缺什么还需要再拷贝很麻烦,不如搭建跟文件系统,需要什么库就下什么,下面介绍一下搭建过程

            //安装必要依赖 qemu 能安装就安装,安不了也没事
            $ sudo apt-get install qemu-user-static binfmt-support debootstrap qemu
            

            //和下载根文件系统密钥相关
            $ sudo apt-get install debian-archive-keyring  

            //创建一个build目录
            $ sudo mkdir build
            $ cd build

            //构建文件系统的命令 sudo debootstrap --arch [平台]             [发行版本代号]      [目录]               [源]
            $                   sudo debootstrap  --arch=arm64   --foreign      xxxx         linux-rootfs

            // [-foreign]     在与主机架构不相同时需要指定此参数,仅做初始化的解包
            // [发行版本代号] 用lsb_release -a获取  例如 debian11 代号是 bullsey, 注意要用小写字母
            // [源]           我使用默认源,所以不填写

            //==================注意此时还是在build目录下操作==================

            //qemu-aarch64-static是其中的关键,能在x86_64主机系统下chroot到arm64文件系统
            $ sudo cp -a /usr/bin/qemu-aarch64-static ~/build/linux-rootfs/usr/bin/qemu-aarch64-static

            //执行ch-mount.sh脚本  -u 是取消挂载  -m 是挂载  ch-mount.sh脚本的内容在下面
            $ ./ch-mount.sh -m linux-rootfs/

            //执行脚本后,没有报错会进入文件系统,显示 I have no name ,这是正常的
            I have no name!@node2:/# 

            //初始化文件系统,会把一个系统的基础包等全部初始化
            $ debootstrap/debootstrap --second-stage

            //初始化好了以后,退出文件系统
            $ exit

            //再次进入时,不需要执行脚本,使用chroot命令即可
            $ sudo chroot linux-rootfs

            //================================================================================================
            //下面是 ch-mount.sh 脚本的内容

            #!/bin/bash

            function mnt() {
                echo "MOUNTING"
                sudo mount -t proc /proc ${2}proc
                sudo mount -t sysfs /sys ${2}sys
                sudo mount -o bind /dev ${2}dev
                sudo mount -o bind /dev/pts ${2}dev/pts		
                sudo chroot ${2}
            }
        
            function umnt() {
                echo "UNMOUNTING"
                sudo umount ${2}proc
                sudo umount ${2}sys
                sudo umount ${2}dev/pts
                sudo umount ${2}dev
        
            }
        
            if [ "$1" == "-m" ] && [ -n "$2" ] ;
            then
                mnt $1 $2
            elif [ "$1" == "-u" ] && [ -n "$2" ];
            then
                umnt $1 $2
            else
                echo ""
                echo "Either 1'st, 2'nd or both parameters were missing"
                echo ""
                echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
                echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
                echo ""
                echo "For example: ch-mount -m /media/sdcard/"
                echo ""
                echo 1st parameter : ${1}
                echo 2nd parameter : ${2}
            fi


交叉编译工具链的准备

交叉编译链的选择也主要glibc版本问题,主要是向目标机器看齐,多花一些时间把目标机器开发环境的版本搞清楚,找到合适版本的交叉编译链

            xxx@xxx:/lib/aarch64-linux-gnu$ strings libc.so.6 | grep ^GLIBC_
            GLIBC_2.17
            GLIBC_2.18
            GLIBC_2.22
            GLIBC_2.23
            GLIBC_PRIVATE

查看arm电脑上的结果,可以支持的版本有2.17、2.18、2.22、2.23,也就是说我们要找的交叉编译链的C库版本符合其中的一个就行,这样提高了兼容性

交叉编译链制作太复杂,我是在下面这个网站找的

            https://releases.linaro.org/components/toolchain/binaries/   旧版本(我用的这个)

            下面这几个没用过,不过也列出来

            https://snapshots.linaro.org/gnu-toolchain/ 新版本

            https://www.linaro.org/downloads/ 官方网站

            https://developer.arm.com/downloads/-/gnu-a  arm开发工具下载

再点击进入几层目录,直接到达这个地址,选择解压后能直接用的成品(还要注意32位、64位,大端序还是小端序,选择基于自己开发环境的系统和机器),如下

            https://releases.linaro.org/components/toolchain/binaries/5.4-2017.05/aarch64-linux-gnu/

            gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz	27-Feb-2018 00:14	86.5M	open     #这个是解压后就能用的

直接下载,放到虚拟机中,解压,首先查看一下上面说到的版本,结果如下,交叉编译链的C库版本有和能目标机器对应的版本,这就是可以用的

            xxx@xxx:/usr/local/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib$ strings libc.so.6  | grep ^GLIBC_
            GLIBC_2.17
            GLIBC_2.18
            GLIBC_PRIVATE


qt源码文件的配置

交叉编译链解压放在某个位置,接着就可以设置xxx/qt-everywhere-src-5.13.2/qtbase/mkspecs/linux-aarch64-gnu-g++对应的编译链路径

            lzq@lzq-VirtualBox:/opt/qt-src/qt-everywhere-src-5.13.2/qtbase/mkspecs/linux-aarch64-gnu-g++$ cat qmake.conf
            #
            # qmake configuration for building with aarch64-linux-gnu-g++
            #

            MAKEFILE_GENERATOR      = UNIX
            CONFIG                 += incremental
            QMAKE_INCREMENTAL_STYLE = sublib

            include(../common/linux.conf)
            include(../common/gcc-base-unix.conf)
            include(../common/g++-unix.conf)

            # modifications to g++.conf  下面这些就是交叉编译链的路径
            QMAKE_CC                = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
            QMAKE_CXX               = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
            QMAKE_LINK              = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
            QMAKE_LINK_SHLIB        = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

            # modifications to linux.conf
            QMAKE_AR                = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
            QMAKE_OBJCOPY           = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
            QMAKE_NM                = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
            QMAKE_STRIP             = /opt/arm-libc/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
            load(qt_config)


configure的配置

创建一个shell脚本用于执行qt的configure,如下,出了问题再一步步完善脚本和库文件(这应该就是最终形态了)

            #!/bin/bash 

            cd ~/forQt/qt-everywhere-src-5.12.12

            export LD_LIBRARY_PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib:${LD_LIBRARY_PATH}
            export LD_LIBRARY_PATH=/home/lzq/forQt/debian-11-linux-rootfs/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH}
            export LD_LIBRARY_PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH}

            export PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib/aarch64-linux-gnu:${PATH}
            export PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib:${PATH}
            export PATH=/home/lzq/forQt/debian-11-linux-rootfs/lzq:${PATH}

            ./configure  -prefix  /qtbuild \
            -opensource \
            -c++std c++14 \
            -confirm-license \
            -nomake examples \
            -nomake tests \
            -sysroot /home/lzq/forQt/debian-11-linux-rootfs \
            -xplatform linux-aarch64-gnu-g++ \
            -no-opengl \
            -release 


本地环境和根文件系统需要安装的环境

这里先列出所有需要安装的库和工具,这只是我进行交叉编译时发现需要安装的,读者实际操作时遇到缺失的库安装即可

            //本地x86环境和arm根文件系统都要安装,避免出现奇怪的依赖问题

            flex gperf bison pkg-config 
            zlib1g zlib1g-dev 
            libgcrypt20 libgcrypt20-dev 
            liblz4-dev liblz4-1 
            libzstd-dev  libzstd1  
            liblzma-dev  liblzma5 
            fontconfig libfontconfig1-dev 
            dbus libdbus-1-dev 
            libsystemd0 libsystemd-dev
            libnss3 libnss3-dev
            libgl1-mesa-dev pkg-config
            g++ gcc make


本地x86环境安装Python

注意要在上面的环境安装完成后再安装Python,安装Python主要是为了编译qtwebengine,不同版本的qt对Python的版本也不一样,qt5.12.12要求的版本是2.7.5及其以后,我这里采用2.7.18

需要下载源码在本地x86环境编译安装,根文件系统不需要操作,【网络链接】Python2.7.18下载链接


目录权限的设置

到目前为止,所有的环境已经搭建完毕,还需要进行关键的一步,将qt源码所在目录和根文件系统所在目录的权限设置为777

            sudo chmod -R 777 xxxx

由于没有设置这个权限,导致需要使用sudo make执行,此时会导致链接库的路径错误,编译qtwebengine的时候会出问题


执行configure脚本并编译源码

下面我记录一些执行configure脚本或者编译过程中会出现的问题,有则改之


问题 : 执行脚本遇到语法报错

            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/include/QtCore/../../src/corelib/global/qendian.h:333:35: error: 'numeric_limits' is not a member of 'std'
            333 |     { return QSpecialInteger(std::numeric_limits::min()); }
    
            【解决方法】  对应头文件或源文件增加 #include  这个问题在后续的编译中可能还会出现,目前我只会一个个改,有好的方法再更新


问题 : 缺少必要库

            WARNING: Python version 2 (2.7.5 or later) is required to build QtWebEngine.  源码下载链接 https://www.python.org/downloads/release/python-2718/

            WARNING: gperf is required to build QtWebEngine.                              源码下载链接 http://ftp.gnu.org/gnu/gperf/
            
            WARNING: bison is required to build QtWebEngine. 
            
            WARNING: flex is required to build QtWebEngine.
            
            WARNING: host pkg-config not found

           【解决方法】  在根文件系统下安装需要的库(包管理器没有就下载源码自己编译安装,注意版本),
                         安装完毕后,在根文件系统下创建一个单独的目录,在里面创建若干个软链接,
                         这些软链接分别指向这些安装好的二进制文件,注意在本地系统环境执行创建软链接命令
                         安完一个看一下warning有没有消失(记得删除config.cache再执行脚本)

           【python这里有点奇怪】我在根文件系统下编译源码安装没有作用,在本地系统下(x86)编译安装反而没有warning了

        
           注意configure脚本需要增加一行
           export PATH=/home/lzq/forQt/linux-rootfs/lzq/:${PATH}  #就是存放软链接的那个路径


问题 : webengine需要的库缺少

            Required system libraries:
                fontconfig ........................... no
                dbus ................................. no
                nss .................................. no
                khr .................................. no
                glibc ................................ yes


            【解决方法】根文件系统中上面这些库或者其对应的.pc文件,pc文件需要安装库对应的-dev包,
                        可以用 apt-cache search xxx 查询

            例如 
                    apt-cache search fontconfig | grep dev  //会输出一个列表其中包含libfontconfig1-dev
                    apt install libfontconfig1-dev


            接下来是khr,这个不是库是头文件,查看config.cache文件可知

            cache.webengine-khr._KEYS_ = result msgs
            cache.webengine-khr.result = false
            cache.webengine-khr.msgs = "+ cd /home/lzq/forQt/qt-everywhere-src-5.12.12/config.tests/khr && PKG_CONFIG_SYSROOT_DIR=/home/lzq/forQt/linux-rootfs 
            PKG_CONFIG_LIBDIR=/home/lzq/forQt/linux-rootfs/usr/lib/pkgconfig:/home/lzq/forQt/linux-rootfs/usr/share/pkgconfig:/home/lzq/forQt/linux-rootfs/usr/lib/
            aarch64-linux-gnu/pkgconfig /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/bin/qmake \"CONFIG -= qt debug_and_release app_bundle lib_bundle\" \"CONFIG += 
            shared warn_off console single_arch\" \"QMAKE_CFLAGS += --sysroot=/home/lzq/forQt/linux-rootfs\" \"QMAKE_CXXFLAGS += --sysroot=/home/lzq/forQt/linux-rootfs\" 
            \"QMAKE_LFLAGS += --sysroot=/home/lzq/forQt/linux-rootfs\" -early \"CONFIG += cross_compile\" /home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine/config.
            tests/khr" "+ cd /home/lzq/forQt/qt-everywhere-src-5.12.12/config.tests/khr && MAKEFLAGS= /usr/bin/gmake clean && MAKEFLAGS= /usr/bin/gmake" "> rm -f khr.o" 
            "> rm -f *~ core *.core" "> /home/lzq/forQt/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ -c -pipe --sysroot=/home/lzq/forQt/
            linux-rootfs --sysroot=/home/lzq/forQt/linux-rootfs -O2 -std=gnu++11 -w -fPIC  -I/home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine/config.tests/khr -I. 
            -I/home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/mkspecs/linux-aarch64-gnu-g++ -o khr.o /home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine/config.tests/
            khr/khr.cpp" "> /home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine/config.tests/khr/khr.cpp:29:29: fatal error: KHR/khrplatform.h: No such file or 
            directory" "> compilation terminated." "> gmake: *** [Makefile:169: khr.o] Error 1"

            好像是和opengl有关系,直接执行 apt-get install libgl1-mesa-dev

            
            还有最后一步操作 将根文件系统/usr/lib/目录下的aarch64-linux-gnu整个文件拷贝到 x86本地环境/lib目录下 
            然后将x86本地环境 /lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 创建一个软链接放置到/lib下

            这里要注意,如果根文件系统后面又安装了新库,那么还得再操作一遍,保证能链接到新的库文件和找到新的.pc文件

            进行完以上操作,webengine要求的系统库就都为yes了


问题 : 编译过程中报错找不到库

            /home/lzq/forQt/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/5.4.1/../../../../aarch64-linux-gnu/bin/ld: warning: libz.
            so.1, needed by /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so, not found (try using -rpath or -rpath-link)
            /home/lzq/forQt/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/5.4.1/../../../../aarch64-linux-gnu/bin/ld: warning: libdl.
            so.2, needed by /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so, not found (try using -rpath or -rpath-link)
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so: undefined reference to `dlerror@GLIBC_2.17'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so: undefined reference to `uncompress'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so: undefined reference to `compress2'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so: undefined reference to `dlclose@GLIBC_2.17'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Network.so.5: undefined reference to `inflate'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Network.so.5: undefined reference to `inflateInit2_'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Network.so.5: undefined reference to `inflateEnd'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so: undefined reference to `dlopen@GLIBC_2.17'
            /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/lib/libQt5Core.so: undefined reference to `dlsym@GLIBC_2.17'
            collect2: error: ld returned 1 exit status
            make[4]: *** [Makefile:99:../../../bin/canbusutil] 错误 1
            make[4]: 离开目录“/home/lzq/forQt/qt-everywhere-src-5.12.12/qtserialbus/src/tools/canbusutil”

            【解决方法】我认为可以通过设置configure参数来解决这个问题,但是没有找到用哪个参数
                        但有一个笨办法,就是修改对应的Makefile,在LIBS后面加上需要的库,
                        比如这个问题就是需要修改/home/lzq/forQt/qt-everywhere-src-5.12.12/qtserialbus/src/tools/canbusutil目录下的Makefile加上-lz -ldl
                        
                        编译过程中大概会有十几个这样的报错,慢慢改吧


问题 : 没有编译qtwebengine

编译过一遍会发现qtwebengine并没有被编译,需要单独编译,不知道为什么很奇怪

        【解决方法】cd /home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine

                export LD_LIBRARY_PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib:${LD_LIBRARY_PATH}
                export LD_LIBRARY_PATH=/home/lzq/forQt/debian-11-linux-rootfs/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH}
                export LD_LIBRARY_PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH}

                export PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib/aarch64-linux-gnu:${PATH}
                export PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib:${PATH}
                export PATH=/home/lzq/forQt/debian-11-linux-rootfs/lzq:${PATH}

                export PKG_CONFIG_PATH=/home/lzq/forQt/debian-11-linux-rootfs/usr/lib/aarch64-linux-gnu/pkgconfig

                然后  /home/lzq/forQt/qt-everywhere-src-5.12.12/qtbase/bin/qmake 生成Makefile 并make


                应该会遇到一个编译问题,还是库链接的问题
                /home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine/src/process 编译错误

                LIBS 后面再加
                -lrt -lz -ldl -lpng  -lnssutil3 -lsmime3  -lplds4  -lplc4  -lnspr4  -lexpat  
                -lfontconfig -lnss3 -lresolv -ldbus-1 -lfreetype -luuid -lsystemd -lbrotlidec
                -llzma   -lzstd  -llz4  -lgcrypt  -lbrotlicommon  -lgpg-error             


问题 : 编译qtwebengine遇到的问题[使用ubuntu24.04作为根文件系统时遇到的]

1. 还有个编译错误

../../3rdparty/chromium/third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc:141:65: error: no matching function for call to 'max(int, long int)'

static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);

【解决方法】 sudo vim /home/lzq/forQt/qt-everywhere-src-5.12.12/qtwebengine/src/3rdparty/chromium/third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc

修改为:

long int lzq_temp = 16384;

static const unsigned kSigStackSize = std::max(lzq_temp, SIGSTKSZ);

2. ../../3rdparty/chromium/ui/gfx/x/x11.h:23:26: fatal error: X11/Xlib-xcb.h: No such file or directory 会出现一些这样找不到头文件的错误

【解决方法】 apt-file search xxxxx.h //使用这个神器 通过头文件找对应的库文件,然后安装即可

本地环境需要安装 【注意,未必需要安装这么多,缺什么安装什么,我只是把自己安装的都记录下来了】

libxcursor-dev libx11-xcb-dev libxi-dev libxtst-dev libxrandr-dev libghc-x11-doc libghc-x11-doc libghc-x11-dev libnss3-dev

根文件系统需要安装

libxdamage1 libxdamage-dev

//把头文件的路径改一下【注意,未必需要修改,需要修改时再修改】

// Xlib.h defines base types so it must be included before the less

// central X11 headers can be included.

#include </usr/include/X11/Xlib.h>

// And the rest so that nobody needs to include them manually...

#include </usr/include/X11/X.h>

#include </usr/include/X11/XKBlib.h>

#include </usr/include/X11/Xatom.h>

#include </usr/include/X11/Xcursor/Xcursor.h>

#include </usr/include/X11/Xlib-xcb.h>

#include </usr/include/X11/Xregion.h>

#include </usr/include/X11/Xutil.h>

#include </usr/include/X11/cursorfont.h>

#include </usr/include/X11/extensions/XI2.h>

#include </usr/include/X11/extensions/XInput.h>

#include </usr/include/X11/extensions/XInput2.h>

#include </usr/include/X11/extensions/XIproto.h>

#include </usr/include/X11/extensions/XShm.h>

#include </usr/include/X11/extensions/XTest.h>

#include </usr/include/X11/extensions/Xfixes.h>

#include </usr/include/X11/extensions/Xrandr.h>

#include </usr/include/X11/extensions/Xrender.h>

#include </usr/include/X11/extensions/record.h>

#include </usr/include/X11/extensions/shape.h>

#if defined(USE_XSCRNSAVER)

#include </usr/include/X11/extensions/scrnsaver.h>

#endif


后记

交叉编译这个概念是在上家公司任职中遇见的,当时公司要将产品移植到arm架构的国产化电脑上,arm架构的电脑编译速度慢而且公司一共只有几台,大家都在这几台电脑上编译是很消耗时间的

后来公司的一个大佬就在服务器上搭建了一套环境用于交叉编译,他自己制作了一个交叉编译工具链,用的是clang,而且搞了一两个月就成了(然后大佬就撤了,我都没来及问问怎么搞的)

当时我就对交叉编译这个事很感兴趣,感觉很神奇,至此之后我就自己开始捣鼓怎么交叉编译qt源码,没有技术大佬那两把刷子,但在捣鼓中也理解了Makefile文件、qt pro文件以及一些库链接的知识

虽然没有成功的走到目标地点,但是一路上的风景也是很精彩的

已经断断续续研究一年这个qt源码交叉编译了,没有理论基础只靠自己一点点的尝试很消耗经历,这次就先研究到这里吧,以后再有兴趣继续研究


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序 SSM 新生报到系统小程序 功能介绍 学生 登录 注册 忘记密码 首页 学校公告 录取信息 录取详情 师资力量 教师详情 收藏 评论 用户信息修改 宿舍安排 签到信息 在线缴费 教室分配 我的收藏管理 我要发贴 我的发贴 管理…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验&#xff0c;也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位&#xff0c;以免落后于大型机构。…

罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式

1、const 1&#xff09;、常量 const一般的用法就是修饰变量、引用、指针&#xff0c;修饰之后它们就变成了常量&#xff0c;需要注意的是const并未区分出编译期常量和运行期常量&#xff0c;并且const只保证了运行时不直接被修改 一般的情况&#xff0c;const放在左边&…

深度卷积神经网络 AlexNet

一、机器学习深度学习的发展 1、机器学习SVM方法 &#xff08;1&#xff09;20世纪90年代&#xff0c;基于统计学习理论的结果&#xff0c;开发了一种新型的学习算法——支持向量机&#xff08;SVM&#xff09;。这就产生了一类新的理论上优雅的学习机器&#xff0c;它们将SVM…

大厂面试官问我:MySQL宕机重启了,怎么知道哪些事务是需要回滚的哪些是需要提交的?【后端八股文九:Mysql事务八股文合集】

本文为【Mysql事务八股文合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ 大家第一眼看到这个标题&#xff0c;不知道心中是否有答案了&#xff1f;在面试当中&#xff0c;面试官经常对项目亮点进行深挖&#xff0c;来考察你对这个项目亮点的理解以及…

2024/7/6 英语每日一段

More than half of late-teens are specifically calling for more youth work that offers “fun”, with older teenagers particularly hankering for more jollity, according to a study carried out by the National Youth Agency. One in 10 said they have zero option…

vite+vue3整合less教程

1、安装依赖 pnpm install -D less less-loader2、定义全局css变量文件 src/assets/css/global.less :root {--public_background_font_Color: red;--publicHouver_background_Color: #fff;--header_background_Color: #fff;--menu_background: #fff; }3、引入less src/main.…

罗剑锋的C++实战笔记学习(二):容器、算法库、多线程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一个基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;语义&#xff0c;也就是说&#xff0c;容器里存储的是元素的拷贝、副本&#xff0c;而不是引用 容器操作元素的很大一块成本就是值的拷贝…

重大更新来袭!!《植物大战僵尸杂交版V2.1+修改器+融合版》

大家好&#xff01;每个软件更新总是令人兴奋不已。前段时间介绍的《植物大战僵尸》系列以其独特的策略玩法和丰富的植物角色&#xff0c;赢得了很多玩家的喜爱。而在今天&#xff0c;这款经典游戏全网最新版本——《植物大战僵尸&#xff1a;杂交版V2.1》正式推出&#xff0c;…

【Mindspore进阶】实战ResNet50图像分类

ResNet50图像分类 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类别。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。 ResNet网络介绍 ResNet50网络是2015年由微…

vue require引入静态文件报错

如果是通过向后端发送请求&#xff0c;动态的获取对应的文件数据流很容易做到文件的显示和加载。现在研究&#xff0c;一些不存放在后端而直接存放在vue前端项目中的静态媒体文件如何加载。 通常情况下&#xff0c;vue项目的图片jpg&#xff0c;png等都可以直接在/ass…

量化机器人:金融市场的智能助手

引言 想象一下&#xff0c;在繁忙的金融市场中&#xff0c;有一位不知疲倦、冷静客观的“超级交易员”&#xff0c;它能够迅速分析海量数据&#xff0c;精准捕捉交易机会&#xff0c;并自动完成买卖操作。这位“超级交易员”不是人类&#xff0c;而是我们今天要聊的主角——量…

Qt5.9.9 关于界面拖动导致QModbusRTU(QModbusTCP没有测试过)离线的问题

问题锁定 参考网友的思路&#xff1a; Qt5.9 Modbus request timeout 0x5异常解决 网友认为是Qt的bug&#xff0c; 我也认同&#xff1b;网友认为可以更新模块&#xff0c; 我也认同&#xff0c; 我也编译了Qt5.15.0的code并成功安装到Qt5.9.9中进行使用&#xff0c;界面拖…

从CPU的视角看C++的构造函数和this指针

从汇编角度&#xff0c;清晰的去看构造函数和this指针到底是个什么东西呢&#xff1f;也许可以解决你的一点小疑问 首先写一个很简单的代码demo&#xff1a; class A{ public:int a;A(){;}void seta(int _a){a_a;}A* getA(){return this;} };int fun1(int px){return px; }in…

全新桌面编辑器

目录 前言 一、链接 ONLYOFFICE 8.1版本 官网下载链接&#xff1a; ONLYOFFICE 在线工具&#xff1a; 下载版本推荐&#xff1a; 二、使用体验 1. 界面设计&#xff1a; 2. 文档编辑功能&#xff1a; 3. 电子表格功能&#xff1a; 4. 演示文稿功能&#xff1a; 5.PDF编…

python-开关灯(赛氪OJ)

[题目描述] 假设有 N 盏灯&#xff08;N 为不大于 5000 的正整数&#xff09;&#xff0c;从 1 到到 N 按顺序依次编号&#xff0c;初始时全部处于开启状态&#xff1b;第一个人&#xff08; 1 号&#xff09;将灯全部关闭&#xff0c;第二个人&#xff08; 2 号&#xff09;将…

nginx修改网站默认根目录及发布(linux、centos、ubuntu)openEuler软件源repo站点

目录 安装nginx配置nginx其它权限配置 安装nginx dnf install -y nginx配置nginx whereis nginxcd /etc/nginx llcd conf.d touch vhost.conf vim vhost.conf 命令模式下输入:set nu或:set number可以显示行号 复制如下内容&#xff1a; server {listen 80;server_name…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流浪动物信息管理的提升&…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案&#xff0c;不仅保持了与原生Elasticsearch 的高度兼容性&#xff0c;还在功能、性能、稳定性…

Spring框架Mvc(2)

1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 &#xff0c;测试结果 3.用Json来对其进行数据的传递 &#xff08;1&#xff09;Json是一个经常使用的用来表示对象的字符串 &#xff08;2&#xff09;Json字符串在字符串和对象…