qt4.6 Linux
./configure -static -release -confirm-license -opensource -qt-zlib -qt-libpng -qt-libjpeg -nomake examples -nomake demos -nomake doc -prefix /opt/qt4_static

qt5.6 linux
./configure -static -release -confirm-license -opensource -no-xcb -qt-zlib -qt-libpng -qt-libjpeg -nomake examples -qt-sql-sqlite -prefix /opt/qt5_static

ubuntu14
apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-glx0-dev libxcb-xinerama0-dev
./configure -static -release -confirm-license -opensource -qt-xcb -qt-zlib -qt-libpng -qt-libjpeg -nomake examples -qt-sql-sqlite -prefix /opt/qt5_static

http://blog.csdn.net/earbao/article/details/53860574

------------------------------------------------------------------------------------------------------------

Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-opensource-src的tar包,到网上一查,乖乖,大部分人编译这个包居然花费了12~13个小时!但是,根据我在Windows下静态编译Qt的经验,其实这之中很多东西都是可以不用编译的,最终我大约用了40分钟编译完成了全部内容。如果你直接使用官方的sdk安装,那么你就已经有了一个动态库,现在你又通过源码包编译,那么只要编译出静态库,因为你已经有动态库,你甚至只需要编译静态release库就足够了,谁会在平时编译的时候就要用那种浪费时间的静态编译?等到产品要部署到别的机器的时候,Qt需要用的时候连接上就可以了,这样其它的内容,如动态库的demo,examples都依旧可用,安装两个版本又不会花太多时间,岂不两全其美?长话短说,现在说安装步骤。

1. 到网上下载qt-everywhere源码包,

如果你只要库,那么你也可以到下面的网址找到你需要的版本。

http://www.linuxidc.net/thread-2237-1-1.html

2. 解压缩到你的目标目录

3. 通过configure选择要编译的部分。

你可以通过直接修改configure文件中的QT_DEFAULT_BUILD_PARTS="libs tools examples demos docs translations",把examples,docs,demos都去掉(我只去掉了这三个,理论上如果安装了动态版本,tools和translations(这个是linguist要用的)也是可以去掉的。你也可以通过在最终的configure指令中加入 –no-make ***(这里就是刚才提到的PARTS名字),而无需修改configure文件

还有一些选项是默认的,你也可以指定选项。这些默认选项在大部分情况下都是没问题的,可是如果你的程序要部署到某些不确定的linux系统上,譬如有的系统连jpg,png的库都没有(这些在configure默认选项中使用的是系统库,如果系统没有这些库,岂不悲剧),那么你可以加入 –qt-gif  -qt-libpng –qt-libmng –qt-libjpeg几个选项。

如果你决定只用静态库来做最终产品发布,那么你没有必要编译debug库,只需要编译release即可。

4. 使用configure生成makefile

因为你不但想用自己编译的静态库,你还想能够用sdk自动安装的动态库以及那些demos,examples,为了能让两个Qt库共存,configure时必须为静态库制定一个与动态库所在位置不同的文件夹,例如我的sdk安装到 /opt/qtsdk-2010.05/下,那么我就在/opt下建立了一个叫qtstatic的文件夹来存放静态库,然后使用的configure命令:

./configure –prefix /opt/qtstatic –static –release。当然,我不喜欢看到满屏乱七八糟的输出,以及因为一个小错误突然终止了编译,所以又指定了以下选项:

-continue  当发生错误时,尽可能继续编译

-silent 进行make时只会显示警告和错误等,不会把编译指令也输出到屏幕上

当然,如果你最初没有通过修改configure文件的方式来删减编译模块,不要忘记加上-nomake选项,譬如你不想编译examples,就可以加上:

-nomake examples  ,依次类推

因为工程比较大,所以这个步骤可能会花费几分钟的时间。如果你指定编译的内容不是很多,应该可以很快完成。

5. 编译和安装

最后当然就是make和make install了,不过不要忘了make还有多线程编译的功能哟!如果你的机器这段时间不打算做别的事情的话,完全可以加入以下选项:

-k  当发生错误时,尽可能继续编译

-j N  同时进行N项编译,建议N的值为你的CPU核数X1.5。当然,我选的值略微狠了点,我的电脑是奔腾双核T4300,make指令为: make –k –j 4    ,然后我就看到系统监视器里CPU直接飙到100%了。

编译完成,make install就可以。当然,作为linux系统,需要注意文件夹的权限问题……呃,如果你不了解这个问题,我想你需要在linux上多下点儿功夫

6. 如何静态编译一个程序

在pro文件中,加入

CONFIG +=static或者

CONFIG +=staticlib,这个具体取决于你的工程类型了。

这样Qt就会让编译器尽量寻找静态库来连接(包括Qt库之外的那些库),当然,这不排除Qt会静态连接一些会导致兼容性问题的库。这个在Qt Centre中有人提出了一个解法,如有需要可以查阅:

http://www.qtcentre.org/wiki/index.php?title=Building_static_applications

7. 动态/静态两个版本共存问题

通常,你是不需要在系统变量中加入Qt库的位置的。Qt Creator可以自动扫描到系统中存在的Qt库版本,如果扫描不到,你可以通过Creator的 Tool->Options->Qt4中添加静态库的路径。而QDevelop虽然没有那么智能,你也可以手动指定INCLUDE和LIB的位置。或许,这根本就不是一个问题。如果你怀念动态库,或者在产品发布之前并不想体验静态编译那种蜗牛爬一般的速度,你可以在pro文件中指定CONFIG += shared,而且,要记得在Project中选择相应的版本。

8. 静态版本过大的问题

首先,静态编译的Qt程序一个debug版程序150M左右,一个release版本10M左右,这样你知道为什么我不会编译静态debug库了吧?因为没有必要。你可以使用strip,UPX(Windows)等工具来压缩你生成的庞大程序。空间与速度从来都是一对冤家,Windows下静态编译出的程序,经过UPX压缩可以减少到原来的一般体积,但是启动速度也随之严重下降。当然,论程序启动速度,自己的设计和实现才是关键所在,最后发布的程序要不要压缩,那需要根据实际情况而定。

祝你与Qt相处愉快!

PS. configure阶段出现 “Basic XLib functionality test failed“的解决办法:

编译qt-x11-opensource-src-4.5.3是出现“Basic XLib functionality test failed“

解决方法:

此完整出错信息是在./configure阶段
Basic XLib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/zhu/Qt/qt-x11-opensource-src-4.5.2/mkspecs/linux-g++

进config.test/x11/xlib 执行make命令,看出错信息
g++ -Wl,-O1 -o xlib xlib.o    -L/usr/X11R6/lib -lXext -lX11 -lm
/usr/bin/ld: cannot find -lXext
可以看到,g++在/usr/X11R6/lib下,找不到libXext.so

其原因就在于需要安装libX11的开发包,根据自己的系统特点,安装 libX11-dev libXext-dev libXtst-dev

对于Ubuntu,直接 sudo apt-get install libx11-dev libxext-dev libxtst-dev

问题解决!

参考:http://www.linuxidc.com/Linux/2011-05/36303.htm

Linux下快速静态编译Qt以及Qt动态/静态版本共存(提供了编译4.6,5.6的精通编译脚本,并且apt-get install 需要的库也全列出来了。还有分析问题的心理过程)good的更多相关文章

  1. 【最详细最完整】在Linux 下如何打包免安装的QT程序?

    在Linux 下如何打包免安装的QT程序? 版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! ...

  2. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  3. Linux下快速搭建php开发环境

    php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XA ...

  4. linux下快速安装jenkins

    Linux下快速安装Jenkins 建议使用 FileZilla 工具简化以下步骤中移动.环境变量配置等步骤. 1      软件下载 l  Java:jdk-7u17-linux-x64.tar.g ...

  5. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  6. Linux下快速静态编译Qt以及Qt动态/静态版本共存

    Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-open ...

  7. Linux下创建、查看、提取和修改静态库(*.a)

    先说明一点,静态库文件是由多个目标文件打包而成的,在windows下静态库文件的后缀是.lib,而在linux下静态库文件的后缀是.a(a是archive的缩写,也就是文档文件). 废话少说,下面直接 ...

  8. linux下快速列出文件列表的方法

    前言 这两天碰到一个很棘手的问题,需要读取出ubuntu系统中某个目录下所有文件,由于服务器中存储的文件实在太多,导致此过程效率十分低下,动辄需要等待一个小时之久,还只是一个目录.于是如何快速获取文件 ...

  9. Linux下快速设定ip bond

    在计算机网路普及的初期,很多OS系统都使用的为单网卡方式,即一个网卡使用一个IP地址.随着网络要求的不断提高,我们可以对多个网卡进行绑定聚合当一个逻辑网络接口来使用,从而大幅提升服务器的网络吞吐(I/ ...

随机推荐

  1. 33、给华美A100刷固件

    给HAME A100刷固件 目的: 1. 给HAME A100刷固件 2. 配置上UVC驱动 3. 修改内核自带的UVC驱动,使其支持我们自制的二合一摄像头 4. 移植mjpg-streamer 5. ...

  2. 记录一下phper的学习方向

    我是一个懒惰的人,吃了多年技术老本儿,对新技术缺乏学习动力,仗着逻辑思维的优势处理问题 http://www.topthink.com/topic/26730.html

  3. 【66.47%】【codeforces 556B】Case of Fake Numbers

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  4. ImageView一例 分类: H1_ANDROID 2013-10-30 23:02 1812人阅读 评论(0) 收藏

    参考自<疯狂android讲义>2.4节 效果如下: 当点击图上某点时,将之附近放大至下图. 布局文件: <LinearLayout xmlns:android="http ...

  5. Unity3D资源管理架构

    在Unity3D引擎中,场景资源文件(.unity)是以2进制格式存储的.但同一时候它也有一种基于文本的表现格式. 可在Edit>Project Setting>Editor 中设置: 1 ...

  6. 怎样收缩超大的SharePoint_Config数据库

    前言 在已经执行了2年多的SharePointserver上,发现SharePoint_Config的数据库文件越来越大,已经达到90几个GB,收缩能够减小20几个GB,可是一周以后又会恢复到90几个 ...

  7. php中foreach源码分析(编译原理)

    php中foreach源码分析(编译原理) 一.总结 编译原理(lex and yacc)的知识 二.php中foreach源码分析 foreach是PHP中很常用的一个用作数组循环的控制语句.因为它 ...

  8. php实现求一个数的质数因子

    php实现求一个数的质数因子 一.总结 一句话总结:这么简单的题目,还是把变量定义的位置和自增的位置写错. 1 <?php 2 $num=trim(fgets(STDIN)); 3 //如果$n ...

  9. c# 安全队列

    using System;using System.Collections.Concurrent;using System.Collections.Generic;using System.Linq; ...

  10. 【U205】最大值

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令max=a[0](数组下表从0.. ...