繁体   English   中英

在Ubuntu 12.04上构建静态Qt 4.8.1

[英]Static Qt 4.8.1 Build on Ubuntu 12.04

由于可移植性问题,我试图构建一个几乎静态的应用程序。 我希望能够在几个64位linux发行版上运行该可执行文件。 我已经成功地静态链接了Qt并使用静态链接的libstdc ++和libgcc进行了构建。

但是,我有一些第三方图书馆的问题。 我使用-qt-zlib构建了Qt,但最终应用程序仍与系统zlib动态链接。 我特别配置了:

./configure -static -nomake demos -nomake examples -nomake tools -release -no-webkit -qt-zlib -no-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpe

假定应用程序能够链接到Qt的静态构建的zlib,我删除了该应用程序中所有链接到zlib的引用。 在我看来,Qt几乎忽略了-qt-zlib标志,而是使用系统库,然后我的应用程序也使用该系统库。

此外,我必须安装libfontconfig-dev软件包,这样从源构建后的字体就不会太恐怖了,但是现在Qt也可以动态链接到它了。 如您所见,我尝试链接到libfontconfig的静态库,但是因为Qt已经链接到libfontconfig,所以链接程序会忽略它。 在Qt构建过程中,有没有一种方法可以指定不动态链接到第三方库?

我不希望Qt的任何依赖项都被静态链接。 现在,我相信该应用程序至少可以在Ubuntu 12.04上运行,但是其他发行版也可以将某些库放在不同的位置。

我的.pro文件中的代码段:

QT += core \
      gui \
      opengl
QMAKE_CXXFLAGS += -fpermissive
QMAKE_LFLAGS += -static-libgcc -static-libstdc++
CONFIG += static
TEMPLATE = app
LIBS += /usr/local/lib/libboost_thread.a \
        /usr/local/lib/libboost_program_options.a \
        /usr/lib/x86_64-linux-gnu/libfontconfig.a \
        /usr/lib/x86_64-linux-gnu/libGLU.a

ldd的输出:

linux-vdso.so.1 =>  (0x00007fff992b4000)
libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007f195ccbc000)
libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f195caa2000)
**libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f195c86b000)**
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f195c5cf000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f195c3be000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f195c089000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f195be85000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f195bc7d000)
**libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f195ba1c000)**
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f195b7ff000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f195b505000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f195b147000)
/lib64/ld-linux-x86-64.so.2 (0x00007f195ced9000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f195af42000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f195ad18000)
**libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f195ab00000)**
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f195a8e2000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f195a6bd000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f195a4b9000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f195a2b3000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f195a0b1000)
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f1959e99000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f1959c94000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f1959a89000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f1959885000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f195967f000)

更新:

此后,我放弃了这项任务,因为它似乎并不可行。 由于开发人员已经决定可以发布源代码,因此我将使用标准的./configure、make和make install进行移植。

即使我能够静态链接这些库,libc的版本也不同于Ubuntu11。据我所知,libc不能静态链接。 看来最好的选择是使用GNU的自动工具构建一个程序包,但是即使那样也很痛苦。

关于如何使用GNU工具为Qt项目创建./configure脚本的任何提示或技巧?

构建一个可移植的完全静态的可执行文件并不容易。 据我了解,为什么这样做实际上并不可行,存在很多技术问题。 libc不能静态链接,因此出于兼容性方面的考虑,必须使用旧版本的libc进行编译。

在Linux平台上实现可移植性的最佳解决方案是发布源代码并使用GNU的Autotools构建./configure脚本。 但是,使用Qt项目很难完成该任务。

最终,我诉诸于使用基本安装脚本发布源代码,该脚本将检查计算机上是否安装了Qt并使用qmake来构建项目。 这不是一个很好的解决方案,但可以。

如果您不愿意发布源代码,请构建一个半静态(使用Qt以及可能还有其他一些库)链接的可执行文件,并安装一个安装程序以验证库是否位于正确的位置,并在必要时进行安装。

如果我能猜到..

不久前,我在一些基于Linux的操作系统中成为一个静态链接的应用程序,我不得不包含所有静态库,我也想使用3party。 但是对于Qt模块来说,这是一个不清楚的行为..例如,对于我来说:我想要的qico模块将仅静态包含在以下结构中:

在.pro文件中:

QTPLUGIN += qico
DEFINES += STATIC

在main.cpp中:

#ifdef STATIC
#include <QtPlugin>
Q_IMPORT_PLUGIN(qico)
#endif

可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM