Qt 交叉编译

背景

本来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

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

猜你喜欢

转载自blog.csdn.net/only_a_Heroic_car/article/details/124400460