`
dpr905ds
  • 浏览: 18187 次
社区版块
存档分类
最新评论

Windows环境下设置Qt编译环境 - 关于Qt的静态链接库的配置和生成方法

阅读更多

Windows环境下设置Qt编译环境 - 关于Qt的静态链接库的配置和生成方法
2010年08月08日
  最近,自己的工作发生了重大的变化,离开了已经工作了5年之久的Gameloft 上海studio。怎么说呢,说心情好?不好?哈哈。以后写出来吧。
  当下,自己有了更多的时间给自己做喜欢的事情,在此期间,我发现了Qt和wxWidgets,两个都十分power的framework。其他的废话不多说,先让我们看看如何建立Windows 环境下的Qt开发环境。
  1,计算机软件环境。
  操作系统: Microsoft Windows 7 旗舰版
  IDE: Microsoft Visual Studio 2005 Team Edition for Software Developers
  2,下载Qt吧。
  现在的Qt已经被Nokia公司收购,并且将原来的授权模式做了更改,目前分为开源版和商业版本。对个人用户来说,选择Open Source版本就足够了,不影响使用,只不过,我们需要比商业版Qt似乎要多做一些事情,或者说,开发过程变得更加"坎坷"吧。
  首先,Qt的官方网站http://qt.nokia.com,这里有你所需要的所有关于Qt的"家庭琐事",包括Qt及其资源,关于Qt的文档和一个官方的论坛。这样方便所有Qt用户能够更好的了解Qt,使用Qt。应该说,商业化的东西的确比Free software要做得好,一应俱全。
  Ok,我们单刀直入,打开这个链接:
  http://qt.nokia.com/downloads/windows-cpp-vs2008
  这里是windows环境下,visual studio 2005, 2008的开发环境下载页面,在这里能够下载到针对上述环境的Qt SDK,其中包括了所有代码和已经预编译好的framework文件列表。在写这篇blog的时候,我能够下载到的最新版本呢是ver:4.6.3。当您阅读这篇文章的时候,可能某些事情已经发生变化了。可这又能怎么办呢,我们处在一个千变万化的时代,不过我相信,您作为一名聪明的程序员,这点儿小玩意儿不在话下。
  然后接下来需要下载的是能够配合Visual C++ 2005的Add-In包。这个包是为了能将Qt整合到Visual C++中,包括配置,设计和编译Qt应用程序。打开如下的链接:
  http://qt.nokia.com/downloads/visual-studio-add-in
  并下载最新的qt vs add-in package。同样,我写这篇blog的时候,得到的版本呢是1.1.5。
  3,安装Qt
  这个操作其实比较简单,嘿嘿,我们一步一步来。
  首先,安装Microsoft Visual Studio 2005。可以按照默认的设置安装,也可以按照自己的需要安装这个IDE。不过,Visual C++ 2005是必须的(毕竟没有VC,咱啥也干不了。不是吗?)。
  接着,安装最新版本的DirectX SDK。需要安装DirectX SDK这个过程,的确一开始的时候,我自己也觉得很莫名其妙。但在后续的编译Qt库文件的时候,configure.exe文件会提示你需要这个SDK。反正....咱不管啦,安装先。
  接下来,主角出场了,我们需要安装Qt SDK。我默认设定将Qt安装在Y:\盘,这个也是我的工作习惯,几乎所有的开发工具和编译环境,或者framework我都安装在Y:\盘下。其安装目录为:
  Y:\Qt\4.6.3
  最后,我们需要安装的是qt的Visual C++的add-in包。这个安装路径可以自己随便定义。这个软件会在安装的时候,根据环境进行配置。
  4,编译Qt。
  到了这个时候,我们就需要自己编译Qt framework,可以根据我们自己的需要来编译。不过呢,事实上,我们可以不做这一步,不过,如果不做这一步的话,作为程序员的我们,需要付出一些......呃......代价。
  由于Qt的发行版本中,存在两种版本,LGPL版本和商业版本。这两个版本之间,从内容上看,应该是一模一样的,但要是这样的话。对于一般的商业用户来说,何必需要花钱去买商业版呢?哈哈。很明显,还是存在某些差异的,虽然在Qt的官方网站上并没有说明差异上的细节(只是说明一些开源代码和封闭代码的普通区别罢了)。但是事实上,开源版本的Qt对Windows Visual C++只是部分支持,并非完全支持。这个也的确在后面的开发过程中体现出来了。 比如,我们在VC中新建一个Qt工程并编译,其中,release版本的Qt程序能够完全运行,没有任何问题。但是debug版本的Qt程序并不能运行,无论是debug模式下运行还是在Windows环境下运行,都会跳出错误信息并自动退出。其原因就是在于,LGPL版本的Qt framework中并没有给出debug版本的library(这一招够狠的)。
  综合上述问题,我们需要花上一定时间和精力来编译Qt framework。
  在我自己一个人试图编译Qt的时候,发现始终无法成功的编译Qt系统;要么就是编译成功了,在开发Qt程序的时候,出现了链接失败的问题。现在我将给大家一个比较简单的方法来成功编译含有debug和release两种静态链接库的Qt framework。因此,注意,如果您想要使用动态链接库版本的Qt的话,请忽略这篇Blog。
  首先,我们可以利用Windows的控制台(console,或者命令行系统)批处理脚本来帮助我们实现整个编译的过程。在Qt的安装目录中,例如:Y:\Qt\4.6.3\,新建一个控制台批处理文件,可以将该文件命名为auto.bat。用文本编辑器打开该文件,敲入如下的命令:
  @echo off
  set QTDIR=%CD%
  set PATH=%PATH%;%QTDIR%\bin
  set QMAKESPEC=win32-msvc2005
  call "D:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat" x86
  call "D:\Program Files\Microsoft DirectX SDK (June 2010)\Utilities\bin\dx_setenv.cmd" x86
  call configure.exe -debug-and-release -static -qt-sql-odbc -qt-sql-sqlite -no-webkit
  cd src
  call nmake
  cd ..
  @echo on
  这里需要注意的是,我们必须要设定QMAKESPEC,这是告诉Qt,需要编译适合使用在哪个平台下的Qt,所有能够支持的Qt版本在Qt安装目录Y:\Qt\4.6.3\mkspecs中找到。另外一个需要注意的是,在调用VC和DX的设定环境变量批处理文件的时候,需要传入x86的参数。
  在开始编译Qt之前,第一需要调用的是Qt的configure.exe命令文件。在所有参数列表中,-debug-and-release是必须的,因为咱们之所以废这么大劲儿编译Qt,就是为了需要一个包含了debug 和 release 的 Qt framework库文件。因此不要忘了这个参数;另外-static参数也很重要,因为我们需要的是静态链接库文件。在后面的参数列表中,大家可以根据自己的需要,酌情加减参数。需要指出的是-webkit是用来编译第三方浏览器webkit的库文件,编译这个系统需要花费非常长的时间,我这里就把这个文件忽略了;因为Qt编译的时间非常长,大家可以考虑在configure的参数列表中加入参数-fast。
  输入完上述批处理命令之后,保存auto.bat文件。
  接下来,就需要修改Qt的编译选项了,为啥呢。因为Qt默认的编译对象为动态链接库,因此在编译配置文件中设置的都是针对dll类型的编译参数,但我们目前需要编译的是Qt的静态链接库。进入目录:Y:\Qt\4.6.3\mkspecs\win32-msvc2005,用文本编辑器打开该目录中的文件qmake.conf文件,寻找关键字"QMAKE_CFLAGS_RELEASE"和"QMAKE_CFLAGS_DEBUG",并将里面的参数-MD和-MDd分别修改成为-MT和-MTd,然后保存关闭文件。
  在晚上上面的工作之后,现在基本上都可以了,进入windows 控制台,进入Qt的安装目录,键入auto.bat进行编译。接下来的2~4个小时里面,我们就可以做自己的事情啦,看看书,睡个小觉都可以。
  5,测试
  经过漫长的编译过程,Qt总算编译好了,如果严格按照上面的操作方法的话,真个Qt编译过程不会出现什么错误(不过,Qt编译的时候,输出的信息里面也能够看到零零星星的warning信息,想必Qt始终没有真正完成过)。
  接下来,我们需要做一件小事情。删除不需要的lib文件。这个听起来有点儿匪夷所思,是的,我自己在生产Qt lib的时候,也是觉得莫名其妙。在Qt的lib库目录中,除了之前我们自己编译生成的lib文件以外,还有以4作为结尾的lib文件,比如QtCore4.lib,这些文件是原来的Qt官方生成的Lib文件,这些lib照例说放在原处不会出现任何问题。但是事实上,我经过尝试,始终是失败的,也就是说,类似于QtCore.lib和QtCore4.lib,只能存在其中一个。因为像QtCore.lib这类我们之前生成的文件是静态链接库的,所以我们需要将类似于QtCore4.lib这样的动态连接库链接lib文件,存放到另外的文件夹进行备份,当然也可以直接删除。 我们判断新老文件的办法只要看时间戳就可以了。
  到目前为止,生成Qt framework的工作基本完成了。开始进入开发阶段。我们来新建一个Qt工程来实验一下。
  运行Visual C++ 2005,将Qt加入IDE的环境变量。打开菜单Tools->Options...->Projects and Solutions->VC++ Directories添加如下内容:
  Executable files: Y:\Qt\4.6.3\Bin
  Include files: Y:\Qt\4.6.3include
  Library files: Y:\Qt\4.6.3\lib
  然后,我们新建一个Qt GUI Application,在设置向导中,我们都是使用默认选项。在项目的属性中,C/C++ -> Code Generation ->Runtime Library,相应的修改为 debug模式下为-MTd, release模式下使用-MT。另外,我们同样需要将Additional Denpendencies选项中,所有带4后缀的lib文件,改成不带4的lib文件,之所以如此详见上文。
  最后,编译这个Qt应用程序工程,生成可执行文件。看看结果如何。
  ......
  嘿嘿,是不是看到编译过程中的链接错误了,哈哈。因为我们在Additional Denpendenics中还缺少两个lib文件,分别是imm32.lib,winmm.lib,ws2_32.lib。再次进行光荣的compile命令。
  ......
  通过了。运行。
  ......
  Bingo,成功。接下来的事情,要靠大家自己了,嘿嘿,努力吧!
  祝大家coding愉快,哈哈
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics