静态编译qt4.8

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本人是采用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目录 或在当前目录下,

cdsrc 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库





相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
2
分享
相关文章
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
267 1
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
251 0
|
7月前
Qt开发
Qt开发
|
8月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
330 2
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
160 0
Qt开发网络嗅探器02
Qt开发网络嗅探器02
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等