最近在编译linux客户端的时候,出现了瓶颈,不同的CPU + 操作系统 + 内核版本等,造成了客户端维护越来越繁琐,为了提高维护效率,降低维护成本,因此决定采用静态编译。因为是年前的了,所以好多编译时遇到的报错没有截图(所以仅简单做参考记录)

面临的问题:

  1. 后台服务二进制程序依赖glibc,但是不同的操作系统glibc版本不一致,因此程序在不同操作系统运行时会出现版本不符的问题。
  2. QT界面二进制程序除了上面提及glibc的问题,还因为依赖诸多qt库等,导致在不同操作系统中运行报错。

好啦,有了问题,解决就是了,最开始考虑的是交叉编译,openssl和curl静态编译通过后,在qt编译上一直提示qmake不对,无耐之下,只好采用下下策,在对应cpu架构的机器上编译,我是在三种cpu上编译的(龙芯3A2000-mips64el、鲲鹏920-aarch64、因特尔-x86_64),操作系统呢,找的中标麒麟的,因为发现属他的glibc版本低~

问题解决方案:

  1. glibc如果是静态编译,ubuntu下我发现是可以apt install glibc-static直接安装的,但,静态编译不支持dlopen,所以采取了一个旁门左道,利用glibc高版本兼容低版本的方式,嘿嘿(但有风险的,万一程序使用的api在低版本不支持,或者某一个高版本glibc被指定不兼容此低版本glibc,就JJ了)==》好的解决方法,阅读各种手册,完全脱离对glibc下api的依赖
  2. QT就只能静态编译了,但防止个别库还是有依赖性,在编译时pro文件指定了一个参数:QMAKE_RPATHDIR(运行时动态库首先查找路径)

我的环境中,中标麒麟V7系统信息:

  1. x86_64:glibc(2.20)、qt(5.9.9)
  2. aarch64:glibc(2.17)、qt(5.12.9)
  3. mips64el:glibc(2.20)、qt(5.12.9)
  • qt版本不一样,是因为在x86_64上,5.12.9的版本怎么也编译不过,所以就用5.9.9了 

下面是我编译qt时,configure的编译信息:

  • dbus-1.5.12(因为在mips64el上运行时,qt报错了,查询后发现静态编译dbus就可以,所以需要提前静态编译一个dbus)
./configure --prefix=/home/myself/dbus-1 --enable-static --disable-tests
make
make install
  • qt-5.9.9版本
./configure -static -release -opensource -confirm-license -prefix /home/myself/qt-5.9.9 -dbus-linked -I/home/myself/dbus-1/include/dbus-1.0 -I/home/myself/dbus-1/lib/dbus-1.0/include -L/home/myself/dbus-1/lib -no-openssl -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-harfbuzz -sql-sqlite -fontconfig -system-freetype -qt-xcb -skip qtwebengine -nomake tools -nomake examples -nomake tests
gmake -j8
gmake install
  •  qt-5.12.9版本
./configure -static -release -opensource -confirm-license -prefix /home/myself/qt-5.12.9 -dbus-linked -I/home/myself/dbus-1/include/dbus-1.0 -I/home/myself/dbus-1/lib/dbus-1.0/include -L/home/myself/dbus-1/lib -no-webp -no-openssl -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-harfbuzz -sql-sqlite -fontconfig -system-freetype -qt-xcb -skip qtwebengine -nomake tools -nomake examples -nomake tests

gmake -j8
gmake install

下面是静态编译openssl和curl的configure:

  • openssl-1.1.1l版本:
  • 参考:openssl交叉编译问题_ty的专栏_openssl交叉编译
./config --prefix=/home/myself/openssl-1.1.1l -fPIC no-shared
make
make install
  • curl-7.70.0版本:
./configure CFLAGS=-fPIC --disable-ldap --disable-ldaps --disable-shared --disable-threaded-resolver --disable-rt --with-ssl=/home/myself/openssl-1.1.1l/ --prefix=/home/myself/curl-7.70.0
make
make install

其实还涉及到挂载内核驱动,这个只能预编译,在安装的时候根据(cpu架构+操作系统+内核版本),在安装路径中动态查找并挂载了。

编译时用到的源码下载链接,附件太大了,直接百度云吧:

  1. dbus-1.5.12.tar.gz
  2. openssl-1.1.1l.tar.gz
  3. curl-7.70.0.tar.gz
  4. qt-everywhere-opensource-src-5.9.9.tar.xz
  5. qt-everywhere-src-5.12.9.tar
  6. qt-everywhere-src-5.15.2.tar
  • 源码下载链接(百度云,全部下载)  提取码:m758
  • 清华开源软件镜像(仅qt下载)