静态编译 Qt 简单教程


类型:C++ & Qt4,创建时间:March 8, 2018, 11:07 a.m.

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/107/。

跟我打交道过的人都知道我一直在唱衰桌面端 Qt,但是又一直在推荐大家使用 Qt 作为服务端开发的标准库。服务端开发除了完成功能之外,还需要考虑到服务端运维。一般希望布署的程序越简单越好,只好不依赖于特定的系统,一个文件复制到服务端就搞定。这时候静态编译就用上了。

想要静态编译 Qt 就需要下载 Qt 的源代码。服务端开发一般只使用 qtbase,不会去使用剩下的 Qt GUI 组件。所以这里就以 qtbase 为例来讲解。

中国的用户可以考虑从镜像网站下载 qt 会比较快,比如我推荐 http://mirrors.ustc.edu.cn/qtproject/

qtbase下载

下载回来,假定放在 ~/workon 这个目录里面吧。解压:

cd ~/workon
tar -xvf qtbase-everywhere-src-5.11.1.tar.xz

参照我另一篇标准库的文章,使用Qt作为C++的标准库,我打算只编译 Qt 的 QtCore/QtNetwork/QtSql 等非 GUI 的部分。所以编译参数需要特别定制:

./configure --prefix="/usr/local/Qt5.11.1-linux-static" -release -opensource -static -no-gui -no-icu -no-glib -no-iconv -nomake tests -nomake examples

其中的-static指示使用静态链接, -no-gui-no-icu分别表示不编译 GUI 部分,也不使用庞大的ICU库。-no-glib表示不集成 glib 的事件循环。最后的两条-nomake不编译例子和单元测试,编译速度会快一些。

接下来没啥说的:

make -j8
sudo make install

完成之后 Qt 会安装到你的/usr/local/Qt-5.11.1-linux-static下面,我们来试验一下静态编译后的 Qt 如何。

测试使用的qttest.promain.cpp.

# `/workon/qtttest/qttest.pro
QT -= gui
TARGET = qttest
SOURCES += main.cpp

// `/workon/qtttest/main.cpp
#include <QDebug>

int main(int argc, char **argv) {
    qDebug() << "hello, world";
    return 0;
}

编译这个测试文件:

cd ~/workon/qttest
/usr/local/Qt-5.11.1-linux-static/bin/qmake    
make

编译完成后看看这个文件是不是只依赖于 libc 了。

./qttest
readelf -d qttest

输出内容是:

Dynamic section at offset 0x3e4d08 contains 34 entries:
标记        类型                         名称/
0x0000000000000001 (NEEDED)             共享库:[libz.so.1]
0x0000000000000001 (NEEDED)             共享库:[libdl.so.2]
0x0000000000000001 (NEEDED)             共享库:[libpthread.so.0]
0x0000000000000001 (NEEDED)             共享库:[libstdc++.so.6]
0x0000000000000001 (NEEDED)             共享库:[libm.so.6]
0x0000000000000001 (NEEDED)             共享库:[libgcc_s.so.1]
0x0000000000000001 (NEEDED)             共享库:[libc.so.6]
0x0000000000000001 (NEEDED)             共享库:[ld-linux-x86-64.so.2]

只依赖于 libc,把这个文件复制到多数 linux 平台都可以直接跑起来了。不过仍然需要注意 centos 5 这种古老的系统就另外说了。那平台还没有libc.so.6

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/107/。


暂时还没有任何评论。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):