开发者社区> py_tty_0529> 正文

静态编译qt4.8

简介: 本人是采用qt4.8版本测试的,win/linux都ok,5.0以后的版本请参考,不保证按以下方法能编译通过。
+关注继续查看

本人是采用qt4.8版本测试的,5.0以后的版本请参考,不保证按以下方法能编译通过。

win编译:

1)安装支持qt4.8版本的vs,测试中采用vs2010,先安装vs2010;

2)下载QT和qt-for-vs2010插件,qt-win-opensource-4.8.0-vs2010.exe,qt-vs-addin-1.1.10.exe,先安装qt,再安装vs的qt插件,安装插件是请选择支持vs2010.

3)在qt安装目录下,更改qmake.conf文件,若怕修改错,可预先备份,文件所在路径示意:C:\software\Qt\4.8.0\mkspecs\win32-msvc2010

修改:

QMAKE_CFLAGS_RELEASE    = -O2 -MD
 
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
 
QMAKE_CFLAGS_DEBUG      = -Zi -MDd
 
为:
 
QMAKE_CFLAGS_RELEASE    = -O2 -MT
 
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
 
QMAKE_CFLAGS_DEBUG      = -Zi –MTd

4)[可选]
a)如 果做了上一步,那么就不需要嵌入manifest了,去掉CONFIG+= 后面的embed_manifest_dll embed_manifest_exe
b)VC默认是“将wchar_t 视为内置类型”的,所以建议去掉-Zc:wchar_t-, 否则以后用到一些与wchar_t有关的函数
(如fromWCharArray)时,就要在项目属性里设置“将wchar_t视为内置类型”为No了)。

注意:可选(a)选项对于一些中文路径及缓存路径会编译出现中文乱码异常而出现编译错误

5)配置环境变量
管理员身份打开vs2010命令行:

(注意,如果用Visual Studio x64 Win64 Command Prompt (2010)编译时,出来的是64bit的,如果工程项目用到32bit第三方库会比较麻烦,建议Visual Studio Command Prompt (2010)编译)

set QTDIR=c:\software\Qt\4.8.0
set PATH=%PATH%;C:\software\Qt\4.8.0\bin
set QMAKESPEC=win32-msvc2010

cd %QTDIR%

configure -platform win32-msvc2010 -debug-and-release -opensource -static -fast -qt-sql-odbc -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support -qt-zlib -no-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista -nomake docs -nomake demos

[备注,上面命令可以自行配成.bat文件调用,省去每次输入的麻烦]

建议:

a)这里不要把太多插件库编译进去,可等编译好后再自行去plugins下编译插件库,例如数据库插件库-qt-sql-mysql -plugin-sql-mysql,因为编译到多一半的时候会提示找不到mysql的一些文件,还要下一些第三方的东西才能编译qtsql库,所以直接去掉,后续会介绍插件库编译方法)

b)可以configure -help可以显示所有选项的帮助信息,这里罗列出一些,请看附录

c)系统中用户名是中文的情况:

在编译过程中碰到的最大的问题是目录名的问题,QT本身不支持汉语目录名和带空格的目录名,就算源程序和编译目录满足这个条件,然而QT在编译过程中,会大量使用TEMP文件,Window 7系统的TEMP目录在C:\Users\[用户名]\AppData\Local\Temp下,如果当前用户是中文的名,在QT编译过程中就是致命的。最好的解决办法就是吧window的TEMP目录设置在根目录下我就是设置在C:\TEMP 。(Windows下设置用户的环境变量[不用改系统的],把里面的TEMP 和TMP 全部设置成C:\TEMP)

6)编译:

a)configure命令执行,会Do you accept the terms of the license?,输入y并回车即可

b)configure命令成功会Qt is now configured for building. Just run nmake.;To reconfigure, run nmake confclean and configure.提示

c)进入下src目录 或在当前目录下,

($ cd src)
$ nmake
等待编译.............

d)VS命令窗口下进行nmake进行编译时有可能碰到如下提示:
   (1)Perl not found in environment - cannot run syncqt.  
   解决方法:将 bin 目录中的 syncqt 和 syncqt.bat 两个文件改名或删除即可。
   编译 Webkit 时会碰到 U1077错误,导致编译出错,看输出含义是说宏扩展后的字符串中包含有换行。
   解决方法:打开 src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp,定位至 327行,将其中的 “<Section>” 给删除掉。

e)如果编译过程中出现:
命令语法不正确。  
NMAKE : fatal error U1077:.....

可能是环境变量设置的CURR_DIR和TARGETDIR值中含有空格导致了此问题。
通过下面的命令删除环境变量即可。
01.set CURR_DIR=  
02.set TARGETDIR=

f)不建议执行以下步骤:
备份 .qmake.cache 和 configure.cache,若不执行清理则无须备份;
执行如下命令清理:
(本步骤执行完成后会清理掉 src\corelib\global 目录中的 qconfig.h 和 qconfig.cpp,)
 (导致 QT项目不能正确编译,因此不要执行。或是执行本命令之前将上述文件先保存至其他地方。)
nmake confclean
清理完成后将 .qmake.cache 和 configure.cache 移回原位,若不执行清理则无须本操作;

g)编译完成后,就打开Qt 4.8.0 Command Prompt命令行就可进行qt程序的静态编译了qmake -o Makefile  xxx.pro && (nmake debug 或 nmake release)


linux静态编译(redhat6.5):

1)下载源安装程序,如 qt-everywhere-opensource-src-4.8.6.tar.gz

2)解压:tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz

3)配置

a)进入解压目录,配置

./configure -static -release -prefix /usr/local/Qt-4.8.6_static -nomake demos -nomake examples -qt-zlib -qt-libpng -qt-libjpeg -qt-sql-MySQL -qt-sql-sqlite -plugin-sql-ODBC -plugin-sql-PostgreSQL -no-qt3support -no-opengl

[

如果配置时提示某些模块不支持,可以先屏蔽掉或不添加这个模块,后续在单独编译。

参数-static 指的是要采用静态编译Qt的方法
参数-release指的是只编译release版本的库
参数-qt-zlib -qt-gif -qt-libpng -qt-libjpeg 是更好确定Qt编译出的程序能在目前不知的系统下运行。
参数-nomake demos -nomake examples 指的是不编译demos和examples
参数-qt-sql-sqlite 如果没有这个参数,configure的时候,可能会提示sqlite 有问题而中止。
参数 -prefix /usr/local/Qt-4.8.6_static 指明静态编译的Qt安装的目录,命名Qt-4.8.6_static 是为了区别动态编译安装的Qt,因为如果没有这个参数,安装时会覆盖之前动态编译安装的Qt(如果有的话)。

]

b)      注意事项:

可选:

中文支持:ibus ibus-qt4 ibus-table

前置环境:build-essential libpcap0.8-dev libx11-dev libfreetype6-dev libavahi-gobject-dev libSM-dev libXrender-dev libfontconfig-dev libXext-dev

如果出现错误:

       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
      解决办法:yum install libX* 
      (如果是Ubuntu 也可运行sudo apt-get install libx11-dev libxext-dev libxtst-dev)

4)编译:

make

sudo make install

5)增加(或改变)环境变量: (也可以不添加环境变量,使用绝对路径进行编译)

在你home目录下你的的名字的目录中,在.profile文件中追加(或改变)如下环境变量:

(为Qt设置一些特定的环境变量,这个很重要!.profile文件是隐藏的,可在你的名字目录下,按Ctrl+H显示所有文件查看到)

QTDIR=/usr/local/Qt-4.8.6_static/
PATH=$QTDIR/bin:$PATH   
MANPATH=$QTDIR/doc/man:$MANPATH   
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH   
export QTDIR PATH MANPATH LD_LIBRARY_PATH 
7、重启,成功的话,下来用qmake&&make编译以往的Qt程序看是否采用静态编译的。

关于插件库的编译:

1)以数据库为例,其他类似,qt数据库默认安装sqlite驱动,

2)想使用QOCI需要先配置oracle-base-client库,然后去qoci插件源代码目录(src/plugins/sqldrivers/oci,修改其*.pro,加入oci头及库路径:

//////////oci.pro

TARGET = qsqloci
SOURCES = main.cpp
include(../../../sql/drivers/oci/qsql_oci.pri)
include(../qsqldriverbase.pri)
#自行新添加依赖库,可在oracle官网下载其客户端base模块
INCLUDEPATH += /home/myuser/instantclient_12_1/sdk/include
LIBPATH += /home/myuser/instantclient_12_1

//////oci.pro

,然后qmake -o Makefile oci.pro重新生成Makefile文件,make&&make install实现编译安装),在工程文件里引用QTPLUGIN += qsqloci

3)同样,想使用mysql库,需要安装mysql-devel,然后去qt-oci插件源代码目录(src/plugins/sqldrivers/mysql,修改其*.pro,加入mysql头及库路径[类似oci],然后qmake -o Makefile mysql.pro重新生成Makefile,make&&make install再编译),在工程文件里引用QTPLUGIN += qsqlmysql

4)插件库的静态编译其实就是利用已经静态编译好的QT重新编译其插件工程,可以把插件库或其他还是动态库的工程看做你的qt项目编辑,缺啥依赖库就自行补充好了


附录:

-prefix 路径名 编译后的安装路径

-debug-and-release 编译Debug和Release版本

-static 编译静态库,如果不指定,默认为编译成DLL

-opensource 使用LGPL协议,如果不指定也行,configure运行后会问的

-no-qt3support 不用编译与QT3兼容的一些废弃函数,如果你比较熟悉QT3,还是去掉它吧

-no-dbus 不用链接到DBus库,这个库偶在Linux里,Windows里不用。

-no-phonon 同上,不要链接

-no-webkit 是否编译Web相关的一些QT子库,加上这个可以省不少编译时间,就看你是否准备用这些库了。

-qt-gif 使用QT自带的gif库

-qt-zlib 使用QT自带的zlib库

-qt-libpng 使用QT自带的libpng库

-qt-libmng 使用QT自带的libmng库

-qt-libtiff 使用QT自带的libtiff库

-qt-libjpeg 使用QT自带的libjpeg库





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14201 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18579 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27715 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
21933 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15287 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
19979 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23523 0
+关注
py_tty_0529
多年从事自动化系统研发,当前对物联网感兴趣
33
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载