Qt 交叉编译

2023-11-15

背景

本来Qt源码是可以直接使用交叉编译器编译通过,也可以使用编译通过的qmake生成可执行程序;但是可执行程序在没有Qt的环境下无法正常运行。因此我们不只是仅需要编译源码,还需要将依赖的环境编译出来,这样打包可执行程序的同时将相应的依赖拷贝到目标环境下,才可以在目标环境正常运行。

环境配置

由于Qt官方文档中的插件说明是以X11展开,而Qt使用X11框架来在linux下显示图形界面的,所以按道理来说只要在编译Qt源码指定了X11参数之后就应该可以正常显示界面;

但是在实际运行环境中运行可执行程序时发现,还有其他乱七八糟的坑等着你,需要指定其他的构建参数来支持图形界面的正常显示,同时也意味着需要交叉编译其他的依赖。

一、X11

说明:X窗口系统(X Window System,也常称为X11或X)是一种以位图方式显示的软件窗口系统。最初是1984年麻省理工学院的研究,之后变成UNIX、类UNIX、以及OpenVMS等操作系统所一致适用的标准化软件工具包及显示架构的运作协议。X窗口系统通过软件工具及架构协议来创建操作系统所用的图形用户界面。

1、编译X11

出现问题:Xtrans.h: No such file or directory

说明X11依赖Xtrans

出现问题:X.h: No such file or directory

说明X11依赖xorgproto

出现问题:xcb/xcb.h: No such file or directory

说明X11依赖xcb

①、X11与XCB的必要依赖Xtrans

下载地址:https://www.x.org/releases/individual/lib/

构建编译:

#创建构建目录
mkdir build
#进入源码配置
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ ../configure --prefix=/usr/local/X11_INSTALL_ARM --host=arm-linux --enable-option-checking 
#编译
make
#root安装
sudo make install

②、X11与XCB的必要依赖xorgproto

下载地址:https://xorg.freedesktop.org/archive/individual/proto/

构建编译:

#创建构建目录
mkdir build
#进入源码配置
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ ../configure --prefix=/usr/local/X11_INSTALL_ARM --host=arm-linux --enable-option-checking --enable-legacy
#编译
make
#root安装
sudo make install

③、X11依赖XCB:

④、编译X11:

下载地址:https://www.x.org/releases/individual/lib/

构建编译:

#创建构建目录
mkdir build
#配置
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ CFLAGS="-I/usr/local/X11_INSTALL_ARM/include -I/usr/local/XCB_INSTALL_ARM/include" LDFLAGS=-L/usr/local/XCB_INSTALL_ARM/lib ../configure --prefix=/opt/X11_INSTALL_ARM --host=arm-linux --enable-option-checking --enable-unix-transport --enable-tcp-transport --enable-ipv6 --enable-local-transport --enable-malloc0returnsnull
#编译
make
#root安装
sudo make install

2、编译XCB:

说明:libxcb为 X Window System 协议提供接口。

源码下载及依赖说明:https://www.linuxfromscratch.org/blfs/view/svn/x/libxcb.html

①、XCB必要的依赖项xcb-proto:

下载地址:https://xorg.freedesktop.org/archive/individual/proto/

构建编译:

#创建构建目录
makir build
#配置
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ ../configure --prefix=/usr/local/XCB_INSTALL_ARM --host=arm-linux --enable-option-checking
#编译
make
#root安装
sudo make install

添加环境:

sudo vi ~/.bashrc
#文件尾部加入
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/XCB_INSTALL_ARM/lib/pkgconfig
#保存退出
source ~/.bashrc

②、XCB必要的依赖项libXau:

下载地址:https://www.x.org/releases/individual/lib/

构建编译:

#创建构建目录
mkdir build
#配置
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ CFLAGS=-I/usr/local/X11_INSTALL_ARM/include ../configure --prefix=/usr/local/X11_INSTALL_ARM --host=arm-linux --enable-option-checking
#编译
make
#root安装
sudo make install

③、编译libxcb

下载地址:https://www.x.org/releases/individual/lib/

构建编译:

#创建构建目录
mkdir build
#配置
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ CFLAGS=-I/usr/local/X11_INSTALL_ARM/include LDFLAGS=-L/usr/local/X11_INSTALL_ARM/lib ../configure --prefix=/usr/local/XCB_INSTALL_ARM --host=arm-linux --enable-option-checking
#编译
make
#root安装
sudo make install

二、FONTCONFIG

说明:字体库,对界面中的字体提供支持

1、fontconfig必要依赖freetype

下载地址:https://mirror.yongbok.net/nongnu/freetype

构建编译:

#创建构建目录
mkdir build
#配置
CC=aarch64-linux-gnu-gcc ../configure --host=arm-linux --prefix=/usr/local/FREETYPE_INSTALL_ARM --enable-shared --enable-static --with-zlib==no --with-png=no --with-harfbuzz=no
#编译
make
#root安装
sudo make install

2、fontconfig必要依赖libxml2

下载地址:http://xmlsoft.org/sources/old/

构建编译:

#创建构建目录
mkdir build
#配置
CC=aarch64-linux-gnu-gcc ../configure --host=arm-linux --prefix=/usr/local/XML2_INSTALL_ARM --without-python --without-zlib
#编译
make
#root安装
sudo make install

3、编译fontconfig

下载地址:https://www.freedesktop.org/software/fontconfig/release/

构建编译:

#创建构建目录
mkdir build
#配置
CC=aarch64-linux-gnu-gcc ../configure --host=arm-linux --prefix=/usr/local/FONTCONFIG_INSTALL_ARM  FREETYPE_LIBS='-lfreetype -L/usr/local/FREETYPE_INSTALL_ARM/lib' FREETYPE_CFLAGS=-I/usr/local/FREETYPE_INSTALL_ARM/include/freetype2 --enable-libxml2 LIBXML2_LIBS='-L/usr/local/XML2_INSTALL_ARM/lib -lxml2' LIBXML2_CFLAGS='-I/usr/local/XML2_INSTALL_ARM/include/libxml2'
#编译
make
#root安装
sudo make install

三、XKBCOMMON

官网:https://xkbcommon.org/doc/current/

说明:libxkbcommon 是一个键盘键盘映射编译器和支持库,它处理由 XKB(X 键盘扩展)规范定义的键盘映射的缩减子集。它还包含一个用于处理 Compose 和死键的模块以及一个用于列出可用键盘布局的单独库。

目前包括:Qt等一些 XCB 应用程序使用它来提供适当的键盘支持。

1、编译xkbcommon

未进行编译

libxkbcommon是用Meson构建,交叉编译用它还要写个文件.Meson和Ninja配合使用,Meson负责构建项目依赖关系,Ninja进行编译

meson?官网地址:https://mesonbuild.com/

Meson(The Meson Build System)是个项目构建系统,如Makefile,automake,CMake…。Meson是一个Python实现的开源项目。据说开始替代cmake。

2、使用编译好的库

编译libxkbcommon太复杂,直接去网上搜

第一个网址:https://packages.debian.org/bullseye/libxkbcommon-dev

第二个网址:https://launchpad.net/ubuntu/+source/libxkbcommon/

下载之后将目录拷贝到/usr/local/XKB_INSTALL_ARM

四、ICU

ICU 官网:https://icu.unicode.org/home

说明:ICU (International Components for Unicode)是一套成熟的、广泛使用的 C/C++ 和 Java 库,为软件应用程序提供 Unicode 和全球化支持。ICU 具有广泛的可移植性,并在所有平台上以及在 C/C++ 和 Java 软件之间为应用程序提供相同的结果。

交叉编译icu4c

下载地址:https://github.com/unicode-org/icu/releases/tag/release-50-2

构建编译:

#创建构建目录
mkdir -p build_arm/build_ready
#预交叉编译处理
cd build_arm/build_ready
../source/runConfigureICU Linux
make
#编译
../source/configure --host=arm-linux --prefix=/usr/local/ICU_INSTALL_ARM CXXFLAGS=-std=c++11 --with-cross-build=./build_ready --disable-sample --disable-tests CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++
make
#root安装
sudo make install

五、交叉编译Qt-base源码

Qt源码下载地址:https://download.qt.io/archive/qt/5.12/5.12.8/submodules/

1、调整qmake.conf

将Qt源码目录中linux-g++的配置拷贝一份修改为linux-aarch64-gnu-g++

#修改编译器及编译链接路径
MY_FLAGS= -ldl -lxcb -lXau -lxkbcommon -lxml2 -licui18n -licuuc -licudata -L/usr/local/XKB_INSTALL_ARM/lib -L/usr/local/X11_INSTALL_ARM/lib -L/usr/local/FONTCONFIG_INSTALL_ARM/lib -L/usr/local/XCB_INSTALL_ARM/lib -L/usr/local/XML2_INSTALL_ARM/lib -L/usr/local/ICU_INSTALL_ARM/lib 

QMAKE_CC = aarch64-linux-gnu-gcc $${MY_FLAGS}  
QMAKE_CXX = aarch64-linux-gnu-g++ $${MY_FLAGS}
QMAKE_LINK =  $${QMAKE_CXX}
QMAKE_LINK_SHLIB =  $${QMAKE_CXX}

QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy 
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip

2、构建编译:

调整构建参数:需要在config时手动添加配置参数:

eg:

–prefix安装路径

-xplatform 构建平台

-c++std 11 使用c++11标准

-release release版本

-shared 动态库

-opensource 开源源码

-no-dbus -no-opengl 不构建这些支持

-nomake tests -nomake examples 不构建示例代码

-system-freetype -fontconfig 构建字体库插件

-xkbcommom 构建键盘库插件

-xcb 构建xcb插件

-icu 构建icu插件

#创建构建目录
mkdir build_arm
#配置
../configure --prefix=/usr/local/QT5.12.8-ARM -xplatform linux-aarch64-gnu-g++ -release -shared -opensource -no-dbus -no-opengl -nomake tests -nomake examples -system-freetype -fontconfig -xkbcommom -xcb -icu -I/usr/local/XKB_INSTALL_ARM/include -L/usr/local/XKB_INSTALL_ARM/lib -I/usr/local/XCB_INSTALL_ARM/include -L/usr/local/XCB_INSTALL_ARM/lib -I/usr/local/FREETYPE_INSTALL_ARM/include -L/usr/local/FREETYPE_INSTALL_ARM/lib -I/usr/local/FONTCONFIG_INSTALL_ARM/include -L/usr/local/FONTCONFIG_INSTALL_ARM/lib -I/usr/local/ICU_INSTALL_ARM/include -L/usr/local/ICU_INSTALL_ARM/lib -I/usr/local/X11_INSTALL_ARM/include -L/usr/local/X11_INSTALL_ARM/lib 
#编译
make -j4
#root安装
sudo make install -j4

六、使用qmake构建工程

1、qmake 构建工程

/usr/local/QT5.12.8-ARM/bin/qmake *.pro
make -j4

2、拷贝插件和依赖

#将 /usr/local/QT5.12.8-ARM/ 目录中插件和依赖库拷贝到可执行程序运行目录

3、拷贝到目标机器运行

七、踩过的坑:

1、界面不能显示字体?

Qt配置需要指定编译参数fontconfig,添加字体库支持

2、键盘不能使用,按键无反应?

检查xkbcommon,版本或者编译Qt源码时是否指定xkbcommon或者参数xkbcommon是否生效

3、使用Qt原生FileDialog界面没有图片?

Qt配置参数是否指定了-no-png,-no-png会导致图片显示异常

总之,对不了解/不确定的编译参数不要试图跳过它

4、QFileDialog 警告 unsupported in the posix collation implementation

调用QFileDialog时终端提示警告不支持排序,如下:

Case insensitive sorting unsupported in the posix collation implementation

Numeric mode unsupported in the posix collation implementation

编译Qt源码时支持icu可解决

5、mips编译出的库文件是32?

mips后续版本的交叉编译默认编译32

编译64需要指定参数:-mips64r2 -mabi64

6、ARM编译报错不支持 ‘-Wshift-overflow=2’ ‘-Wduplicated-cond’?

参考https://www.whcsrl.com/blog/1027368

总之:由于我使用过两个版本编译Qt源码,第二次编译时在config目录中残留了上次编译的结果,这些残留的编译信息,清除clean都无法清理,重新解压一份源码编译通过

7、Qt多线程编译报错?

多线程编译时使用了多于实际处理器数量编译导致,注意不要用多于本机的cpu数量编译,诡异的问题
如果虚拟机中分配了4cpu(虚拟机不允许分配处理器内核数量大于物理机支持的数量),最多使用4线程构建,有帖子说因为内存爆掉的风险,导致coredump,未验证到底什么原因导致失败

八、补充

龙芯开源社区下载mips交叉编译工具链:
http://www.loongnix.cn/index.php/Cross-compile

Qt插件依赖官方说明:
https://doc.qt.io/qt-5.12/linux-requirements.html

注意:以上文中的下载地址有可能会失效

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 交叉编译 的相关文章

  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • MapItemView 在 dataChanged 信号后不会更新

    我正在使用 QMLMapItemView使用 C 的组件QAbstractListModel基于模型 这MapItemView当模型重置时 或者每当添加新项目或删除现有项目时 工作正常 但是 那MapItemView不反映对已添加项目的更改
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • QtWebEngine Quicknano 在嵌入式 Linux 中没有声音

    我已将 QtWebEngine 编译到我的 i MX6 嵌入式设备中 当我尝试使用 Quicknanobrowser 播放 YouTube 视频时 视频会播放 但没有声音 事实上 当我尝试播放音频文件时没有声音hpr dogphilosop
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开

随机推荐

  • 基于python 自写Tobii VI-T滤波器

    文章目录 官网参考文档 Gap fill in interpolation Eye selection Noise reduction Velocity calculator I VT classifier Merge adjacent f
  • react-router-dom V6

    目录 1 前言 2 变更概览 将 Switch 升级为 Routes 路由匹配组件参数 由 component 改为 element 相对路径识别 子路由不需要补全父路由的path react会自动补全 用 useNavigate 替代 u
  • web开发编码_编码和游戏开发

    web开发编码 As a game enthusiast and a beginner programmer I always wonder what it would be like to develop a game 作为游戏发烧友和初
  • 入门接口测试

    首先 什么是接口呢 接口一般来说有两种 一种是程序内部的接口 一种是系统对外的接口 系统对外的接口 比如你要从别的网站或服务器上获取资源或信息 别人肯定不会把数据库共享给你 他只能给你提供一个他们写好的方法来获取数据 你引用他提供的接口就能
  • gcc 若干安全相关选项

    1 FORTIFY SOURCE buffer over flow 防御 参考 http fedoraproject org wiki Security Features Compile Time Buffer Checks 28FORTI
  • Elasticsearch8.2扩容挪数据master出现异常

    背景 1 ES 8 2 版本集群 从10节点扩到20节点 变更 目标替换老的10个节点 先扩容新节点再下掉老节点 2 挪数据执行exclude API 排除老节点IP 设置迁移速率为800Mb s 默认40Mb s 异常 1 迁移过程中突然
  • python笔记第四章---选择结构

    一 程序的组织结构 fact 任何简单或复杂的算法都可以由顺序结构 选择结构和循环结构这三种基本结构组合而成 顺序结构 计算机的流程控制 选择结构 if语句 循环结构 while语句 for in语句 1 顺序结构 程序从上到下顺序的执行代
  • Linux文件权限的设置

    本文章主要介绍了对Linux文件的权限以及如何设置权限 一 查看文件的权限与属性 ls l 或者 ll查看文件属性 二 可以列出如下图所示的一些信息 rw r r 第一位代表文件类型 d 表示目录 l 表示链接文件 表示普通文件 b 表示快
  • Postman测试webService接口

    1 打开Postman界面如下 设置Content Type text xml 2 设置body 3 请求结果如下 4 至此通过Postman进行webService接口测试测试完毕
  • 使用过滤器和request装饰增强来彻底解决乱码问题

    在客户端以get或者post方式提交数据时 可能会出现客户端与服务端编码集不匹配而发生乱码的现象 在对post方式产生的乱码我们可以用 request setCharacterEncoding utf 8 语句来解决 在对get方式产生的乱
  • maven&​ Plugin ‘org.apache.tomcat.maven:tomcat7-maven-plugin:2.2’ not found​报错解决【问题及解决过程记录】

    目录 什么是 Maven 安装 解压后需要配置环境变量 在path新增路径 验证maven安装成功 Win R打开cmd 输入mvn v 在配置文件中设置本地仓库路径 maven仓库的种类和关系 编辑 maven目录结构 编辑 maven的
  • oracal从入门到精通(一)

    1 1了解最新版本Oracle 11g 可以在Oracle的官方网站www oracle com获取Oracle的版本信息 本书中要讲解的是Oracle 11g的第1版 所以在这里只对Oracle 11g的各版本做以说明 Oracle 11
  • 关于Vue.js组件巨详细的一篇文章

    文章目录 Vue js 组件 全局注册 组件基础 组件命名规则 template 选项 data 选项 局部注册 组件通信 父组件向子组件传值 props 命名规则 单项数据流 props 类型 props 验证 非 props 属性 子组
  • Iterative Shrinkage Thresholding Algorithm

    Iterative Shrinkage Thresholding Algorithm ISTA ISTA 对于一个基本的线性逆问题 y A x
  • 【Webpack5】从零开始学习基础配置

    基本使用 Webpack 是一个静态资源打包工具 它会以一个或多个文件作为打包的入口 将我们整个项目所有文件编译组合成一个或多个文件输出出去 输出的文件就是编译好的文件 就可以在浏览器段运行了 我们将 Webpack 输出的文件叫做 bun
  • [转帖]国产操作系统概念及历史,目前国产操作系统有哪些?

    国产操作系统概念及历史 目前国产操作系统有哪些 2018 05 19 21 20 18 作者 ywnz 稿源 云网牛站整理 https ywnz com linuxgcxt 1786 html 以下为你讲解国产操作系统概念 国产操作系统历史
  • 【链块观点01期】当区块链的风刮到教育行业,哪些变革是注定要发生的?

    原文链接 区块链应用案例 当区块链的风刮到教育行业 哪些变革是注定要发生的 一 教育是国之大计 古往今来 教育都在人类生活中占有着极其重要的位置 教育与社会的进步 文明的发展程度紧密相关 中国正在努力建设和谐社会 而如何达成社会主义和谐社会
  • Android Studio运行时自带签名配置过程详解

    文章转载自 http teachcourse cn 2053 html 摘要 Android Studio比Eclipse在配置Project签名文件时方便很多 可以同时指定debug和release两种模式下的签名文件 debug模式即A
  • SpringBoot的自动装配

    一 什么是SpringBoot自动装配 SpringBoot 定义了一套接口规范 这套规范规定 SpringBoot 在启动时会扫描外部引用 jar 包中的META INF spring factories文件 将文件中配置的类型信息加载到
  • Qt 交叉编译

    背景 本来Qt源码是可以直接使用交叉编译器编译通过 也可以使用编译通过的qmake生成可执行程序 但是可执行程序在没有Qt的环境下无法正常运行 因此我们不只是仅需要编译源码 还需要将依赖的环境编译出来 这样打包可执行程序的同时将相应的依赖拷