类型: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/
下载回来,假定放在 ~/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.pro
和main.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/。
暂时还没有任何评论。