由于可移植性问题,我正在尝试构建一个几乎静态的应用程序。我希望能够在几个 64 位 linux 发行版上运行可执行文件。我已经成功地静态链接 Qt 并使用静态链接的 libstdc++ 和 libgcc 进行构建。
但是,我有一些第 3 方库的担忧。我用 -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
我删除了应用程序中链接到 zlib 的所有引用,假设应用程序能够链接到 Qt 的静态构建 zlib。在我看来,Qt 几乎忽略了 -qt-zlib 标志,并使用了系统库,然后我的应用程序也使用了它。
此外,我必须安装 libfontconfig-dev 包,这样从源代码构建后的字体不会很糟糕,但现在 Qt 也动态链接到它。如您所见,我尝试链接到 libfontconfig 的静态库,但由于 Qt 已链接到 libfontconfig,链接器将忽略它。在 Qt 构建期间有没有办法指定不动态链接到 3rd 方库?
如果可能的话,我不希望任何 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 的版本甚至与 Ubuntu 11 也不同。据我所知,libc 无法静态链接。似乎最好的选择是使用 GNU 的自动工具构建一个包,但即使这样也是一项痛苦的任务。
关于如何使用 GNU 工具为 Qt 项目创建 ./configure 脚本的任何提示或技巧?