静态编译qt4.8

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 本人是采用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库





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Windows C语言 Linux
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件
|
3月前
|
SQL 数据库 C++
C++ Qt开发:Charts与数据库组件联动
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`Charts`组件与`QSql`数据库组件的常用方法及灵活运用。在之前的文章中详细介绍了关于`QCharts`绘图组件的使用方式,本章将继续延续这个知识点,通过使用`QSql`数据库模块动态的读取某一个时间节点上的数据,当用户点击查询数据时则动态的输出该事件节点的所有数据,并将数据绘制到图形组件内,实现动态查询图形的功能。
34 0
C++ Qt开发:Charts与数据库组件联动
|
15天前
|
图形学 Python 容器
【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)
【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)
35 0
|
23天前
qt开发使用camera类获取摄像头信息并拍照保存
qt开发使用camera类获取摄像头信息并拍照保存
|
1月前
|
监控 C++
C++ Qt开发:QProcess进程管理模块
Qt是一个跨平台的C++图形库,简化了窗体应用开发,支持通过拖放组件提升效率。本章节关注`QProcess`组件,它用于控制和管理进程,例如执行命令、运行可执行文件及与外部进程通信。`QProcess`提供多种方法如`start`、`waitForStarted`和`waitForFinished`等,实现启动、监控和交互。示例展示了如何使用`QProcess`获取系统进程和信息,通过`tasklist`和`systeminfo`命令,并将结果展示在`QTreeWidget`中。
28 0
C++ Qt开发:QProcess进程管理模块
|
1月前
|
存储 C++ 网络架构
C++ Qt开发:QUdpSocket实现组播通信
Qt教程:使用`QUdpSocket`实现UDP组播通信。通过设置套接字选项、绑定端口、加入和离开组播组,以及发送和接收数据报,简化跨平台窗体应用开发。关键函数包括`setSocketOption`设置多播TTL,`bind`绑定地址和端口,`joinMulticastGroup`加入组播,`leaveMulticastGroup`退出,`writeDatagram`发送,和`readDatagram`接收数据报。
20 1
C++ Qt开发:QUdpSocket实现组播通信
|
1月前
|
存储 网络安全 C++
C++ Qt开发:QUdpSocket网络通信组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QUdpSocket`组件实现基于UDP的网络通信功能。与`QTcpSocket`组件功能类似,`QUdpSocket`组件是 Qt 中用于实现用户数据报协议(UDP,User Datagram Protocol)通信的类。UDP 是一种无连接的、不可靠的数据传输协议,它不保证数据包的顺序和可靠性,但具有低延迟和简单的特点。
20 0
C++ Qt开发:QUdpSocket网络通信组件
|
1月前
|
数据可视化 数据库 C++
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用

推荐镜像

更多