当前位置: 首页 > news >正文

QT linux 静态编译问题记录

  学习QT开发,首先要搭建开发环境,但对于初学者QT开发包的安装也会遇到种种的问题。QT的安装在QT官网只能下载最新的安装包,对于少老一点的包比如5.X的包已经没有了,只能下载原码进行编译。这时会出现种种的问题。   下载完整编译脚本

  1. 如何进行编译。
  2. 编译后发现界面上文字不能正常显示。这个是因为在QT的高版本中编译默认已经不再包含字体库,如5.12中如果是动态编译还是正常的,但静态编译时就没有了,应用中文字就显示不正常。到了5.14动态库中也不包含了。
  3. 如何编译静态的QT包?这对于发行应用时是非常友好的,这样就不用再打包依赖的QT库。

为解决上面的的问题,下面让我们一一解决。我们以LINUX ubuntu x86或麒麟(kylin)为例讲解步骤:

  • 编译前的环境准备,为了让编译顺利通过我们要安装相关的依赖项
sudo apt-get install libxcb-xinerama0-dev
sudo apt-get install build-essential perl python git
sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
sudo apt-get install libfontconfig1-dev

其中libfontconfig1-dev 就是字体库处理的相关依赖项,所以如果你的字体有问题就一定安装这个包

  • 下载QT原码包 qt-everywhere-src-5.12.10  后面我们要以这个版为例进行编译
  • 解压包,执行下面命令
 tar xvf qt-everywhere-src-5.12.10.tar.xz
  • 进入原码目录执行配置及编译命令
mkdir build_qt5.12
cd qt-everywhere-src-5.12.10./configure -prefix ../build_qt5.12 -release -static -opensource -fontconfig -confirm-license -no-openssl -no-opengl -qt-xcb -skip qtquickcontrols -skip qtquickcontrols2 -skip qtsensors -skip qtdoc -no-compile-examples -platform linux-g++-64make -j$(nproc)  
make install  

这里要说明一下,

-static 是指明要编译成静态库,如果要编译成动态库就把这个参数去掉就可以。

-fontconfig 是指明要编译字体库支持,如果不指明在QT高版中很可以就会出现中文不能正常显示

Arm下qt的静态编译

        如果你在arm下进行QT的静态编译可能还会遇到更多的问题。一个问题就是字体库部分缺失,如果我们不用静态编译还好,用了静态编译可能有些库还是找不到,所以我们来对ARM编译一下说明和记录,注意这里是原生编译不是交叉编译

        Arm下的依赖环境安装可能更多,我当时感觉比X86下调试时复杂的多。也可能是我系统环境太老,总之挺费劲的,下面是我安装的依赖库,如果你编译时还有缺少就再安装。

sudo apt-get install -y libxcb-xinerama0-dev
sudo apt-get install -y build-essential perl python git
sudo apt-get install -y '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
sudo apt-get install -y libfontconfig1-dev libdbus-1-3 libfreetype6 libudev1
sudo apt-get install -y libgl1-mesa-dev libvulkan-dev
sudo apt-get install -y libstdc++-10-dev
sudo apt-get install -y libc6-dev
sudo apt-get install -y gcc-10 g++-10# 设置默认编译器
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100

       但上面这些安装后可能还是不行,对于字体库的处理部分要单独编译,因为没有静态库所以qt还是编不过去。这两个文件我保存好了,里面有一个还是我修改过的,要不在QT编译时会有重定义的错误,所以你还是用我改后的版本,下载址 fontconfig-2.13.1.tar.gz   freetype-2.10.1.tar.bz2

# 编译 fontconfig 静态库   这个要使用自己的修改过的包tar -xzf fontconfig-2.13.1.tar.gz
cd fontconfig-2.13.1
./configure --enable-static --disable-shared
make
sudo make install# 编译 freetype 静态库  
tar -xjf freetype-2.10.1.tar.bz2
cd freetype-2.10.1
./configure --enable-static --disable-shared
make
sudo make install

依赖环境安装差不多了,我就们先来安装和配置

mkdir build_qt5.12
cd qt-everywhere-src-5.12.10
# 清除可能干扰的环境变量unset C_INCLUDE_PATH
unset CPLUS_INCLUDE_PATH
unset CPATH# 设置正确的环境变量
export LIBRARY_PATH=/usr/lib/aarch64-linux-gnu:/usr/local/lib
export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu:/usr/local/lib:${LD_LIBRARY_PATH}echo "${PWD}"./configure \-prefix ${prefix_path} \-release \-static \-opensource \-confirm-license \-fontconfig \-system-freetype \-no-openssl \-no-opengl \-qt-xcb \-nomake tests \-nomake examples \-no-compile-examples \-c++std c++14 \-platform linux-g++ \-xplatform linux-g++ \-skip qtwebengine \-skip qt3d \-skip qtquickcontrols \-skip qtquickcontrols2 \-skip qtsensors \-skip qtdoc \-L /usr/local/lib \-I /usr/local/include/fontconfig \-I /usr/local/include/freetype2 \-L /usr/lib/aarch64-linux-gnu \-I /usr/include/uuid \-sysroot / \-no-pkg-config \-no-vulkan \-no-feature-vulkan \-v \QMAKE_LIBS+="-Wl,--start-group -luuid -lexpat -Wl,--end-group"

配置脚本里有几我要说明一下:

  • 看到前面已经把环境变量清空了,防止干扰,然后设置了必要的路径。
  1. 1. -platform linux-g++ -xplatform linux-g++ 这两个参数的值一个指定当前编译的平台,第二个指定QT的运行平台,所以这两个一定不搞错了
  2. 2. -L /usr/local/lib  -I /usr/local/include/fontconfig -I /usr/local/include/freetype2 这三个路径为什么会出现,原因就是我们自己编译的fontconfig freetype2在/usr/local下,这个路径不是默认环境变量,所以只能我们在这里指定一下。
  3. 3. -L /usr/lib/aarch64-linux-gnu  -I /usr/include/uuid 只所以出现这两个是因uuid  expat在编译过程中会出现找不到的问题,我查了是有的,就在这个目录下,所以我们也只能再指定一下。
  4. 4. -sysroot /  -no-pkg-config  这两个参数是为了让系统不受外界环境的干扰,按照系统预定方式进行,否则可能会因为我们自己的一些定义导致加载混乱出现许多奇怪的问题。
  5. 5. -no-vulkan  -no-feature-vulkan 这两个要禁用是因他们的编译依赖opengl,但我们编译为了快而禁了,所以干脆也把vulkan也禁了。
  6. 6. QMAKE_LIBS+="-Wl,--start-group -luuid -lexpat -Wl,--end-group" 这一行的目的是让-luuid -lexpat在编译时使用静态的库,但我发现编完后还是动态,但也还是留着吧,也许其它原因造成的,先不管了。

http://www.dtcms.com/a/598040.html

相关文章:

  • QT -- 初识
  • 平台推广网站排名嘉兴做网站优化
  • iis 网站访问权限设置网页设计学科门类是啥
  • ubuntu双网卡绑定分享
  • Android监听运行应用的任务变化包含Activity及Service
  • 免费网站推荐货源深圳高端家政服务公司
  • MATLAB语言简介
  • 西安个人做网站不记得域名管理网站
  • 常州网站制作企业单位网站建设维护情况报告
  • Java反射完全指南:从入门到精通
  • seo网站推广报价企业系统包括哪些系统
  • 冬日暖居:科学应对暖气病的生活哲学
  • 网站建设的7个基本流程网站下面版权代码
  • 从文字到世界:空间智能是人工智能的下一个前沿
  • 51单片机逆向
  • 网站域名的管理密码如何索取wordpress禁止加载头部
  • Dubbo-学习笔记1
  • 怎样建设个自己的网站首页中信建设有限责任公司电话打不通
  • 无人机信息采集模块技术要点与难点
  • DDR4 4.27 Self refresh Operation
  • 建设工程业绩查询网站专业制作网站有哪些
  • 新闻类网站开发难点wordpress 注册填密码
  • 金耀网站建设秦皇岛建设局长
  • 捕鱼网站开发自学ui设计学什么软件
  • 网站的建设方法有哪些番禺区网站建设公司
  • 响应式编程 | 如何通过响应式编程提升前端开发效率
  • 网站建设北京海淀seo顾问服
  • 网站空间150m游戏推广话术
  • 高端大气的科技网站网站建设专业的公司
  • 蒙文网站建设情况汇报怎么看网站是服务器还是虚拟主机