zoukankan      html  css  js  c++  java
  • qt 4.6.2 与visual studio 2005 集成(编译方法,以及中间遇到的问题)

    不知不觉在蒂森差不多半个月了,哈哈,时间过得很快,过得很充实,近来研究QT,首先嘛,肯定要学会安装了,这最基础的不会更不用说下面的啦。闲话少说,进正题,基本的安装步骤网上多的是,但参考一个大多数情况是安装不上的,总有这样的那样的问题,基本上我是参考了下面的步骤:

        Qt 4.6.2 虽然新增了LGPL协议,但这也阻碍了我们在VS中使用Qt。因为免费开源的版本只提供了GCC编译好的二进制库,而没有VC编 译好的二进制库,只有商业版本才有VS编译好的针对Windows的DLL,lib等二进制库。

        再者,VC编译器比GCC 还是要强劲很多,并且调试器异常强大。Qt Creator虽然很酷,目前还很粗糙。很多人也更为熟悉VS的界面。用VS编译出二进制库:

        1. 下载并安装 qt-sdk-win-opensource-2010.02.1.exe,安装到默认的 c:qt2010.02.1。它包含了MingGW和 Qt Creator,以及预编译好的二进制文件(用GCC编译的)。你可以直接使用Qt Creator 开始开发工作,不需要任何额外的配置。

        2. 将整个目录 c:qt2010.02.1 拷贝一份到 c:qt4.6.2-vc。我们将会修改目录c:qt4.6.2-vc,使用VC++来编译出所需要的库。这两个目录可以同时存在,Qt使用c:qt2010.02.1,Visual Studio 使用 c:qt4.6.2-vc。

        3. 修改 C:Program FilesMicrosoft Visual Studio 8Common7Tools下的 vsvars32.bat,在环境变量PATH中添加Qt的目录,如 c:qt4.5.0-vcqt,在INCLUDE 添 加上c:qt4.5.0-vcqtinclude , 在LIB添加 c:qt4.5.0-vcqtinclude, 如:

        @set PATH=C:Qt4.6.2-vcqt;c:Program FilesMicrosoft Visual Studio 8Common7IDE;c:Program FilesMicrosoft Visual Studio 8VCBIN;c:Program FilesMicrosoft Visual Studio 8Common7Tools;c:WindowsMicrosoft.NETFrameworkv3.5;c:WindowsMicrosoft.NETFrameworkv2.0.50727;c:Program FilesMicrosoft Visual Studio 8VCVCPackages;%PATH%

        @set INCLUDE=C:Qt4.6.2-vcqtinclude;c:Program FilesMicrosoft Visual Studio 8VCATLMFCINCLUDE;c:Program FilesMicrosoft Visual Studio 8VCINCLUDE;%INCLUDE%

        @set LIB=C:Qt4.6.2-vcqtlib;c:Program FilesMicrosoft Visual Studio 8VCATLMFCLIB;c:Program FilesMicrosoft Visual Studio 8VCLIB;%LIB%

    打开一个cmd命令行窗口,把这个文件拖过来执行,这样,你打开的cmd就具有上面设置的环境变量了,但是这些变量只针对你当前的cmd,不会更改本机配置,所以,不要关闭cmd窗口,你需要在这个CMD窗口中完成接下来的命令。

    (原文是按照第三步来做的,第一次的时候我也是按这一步骤编译,但由于出了后面的问题,便手动在系统环境变量的path中添加C:Qtqt-4.3.1in,注意,这里应该对应安装目录,其实效果跟上面的是一样的)

    4. 执行

    c:> cd c:qt4.5.0-vcqt

    c:qt4.5.0-vcqt> configure -platform win32-msvc2005

    上面这行命令,你可以按自己的需要修改,但注意一定要指明 -platform 后的参数,指明想要配置成那个版本的VS。这一步要花点时间,大概60分钟。

    5. 输入 nmake,回车,开始编译。这一步跟漫长,我的大概编译 了3个小时~~

        注意:如果你是Windows 7下,这里多半会失败,因为Win 7 SDK有Bug,在binary没有resouce区域的时候mt程序是不能把manifest添加到binary中的(参考:http://download.microsoft.com/download/8/8/0/8808A472-6450-4723-9C87-977069714B27/ReleaseNotes.Htm),所以我们需要做一些修改才行,

    第一步,在CMD下执行如下命令

    c:qt4.6.2-vcqt>echo.>hello.rc

    c:qt4.6.2-vcqt> rc.exe /r hello.rc

    得到 c:qt4.6.2-vcqthello.res 资 源文件。

    第二步,修改qmake配置文件,使得Makefile的链接命令中会把hello.res一并链接到binary中。修改mkspecswin32-msvc2005目录下的qmake.conf文件第52行为

    QMAKE_LFLAGS = /NOLOGO C:Qt4.6.2-vcqthello.res

    这样任何link命令都必然会链接hello.res文件。

    然后才能输入nmake开始编译。

    6. 安装官方的VS插件qt-vs-addin-1.0.0-beta.exe

    7. 启动 Visual Studio,选择菜单“Qt->Qt Options”,在” Qt Verions ”选项卡点击 “Add”,Version Name随便填,例如 “qt4.6.2-vc”,路径则输入 “C:Qt4.6.2-vcqt”。(网上的资料有 说要建立环境变量QTDIR= C:Qt4.6.2-vcqt,我个人认为是不必要的)。

    8. 现在你的Visual Studio 完全具备了Qt的所有功能,新建一个Qt 工程编译运行试一试!

    (编译好后,在VS下点击Debug-Debug without debuggine可以看见程序运行的效果,不过

    如果直接到debug目录下双击这个exe文件,会提示找不到QtCore4d.dll,这时你需要把C:Qt4.5.0-vcqtin加入到PATH环境变量,这目录下还有QtCore4.dll,都是上面编译出来的)。

    不过你现在的环境是集成了LGPL版Qt的VS,跟商业版的还是有点不 同。例如Qt Desiner(资源设计器)不是嵌入到VS得,需要通过菜单“Qt->Launch Desiner”来执行(商业版直接双击.ui文件就会启动Qt Desiner)。不过这无关紧要,只是多点几下鼠标而已。

    点击“Qt->Launch Linguist”可以启动Qt Linguist,它是一款本地化工具,也十分有用。

    接着,遇到了如下问题:

    复制代码
    代码
    正在创建库 ........libQtWebKitd4.lib 和对象 ........libQtWebKitd4.e  
    xp
    QNetworkReplyHandler.obj : error LNK2001: 无法解析的外部符号 "public: virtual st
    ruct QMetaObject const * __thiscall WebCore::FormDataIODevice::metaObject(void)c
    onst " (?metaObject@FormDataIODevice@WebCore@@UBEPBUQMetaObject@@XZ)
    QNetworkReplyHandler.obj : error LNK2001: 无法解析的外部符号 "public: virtual vo
    id * __thiscall WebCore::FormDataIODevice::qt_metacast(char const *)" (?qt_metac
    ast@FormDataIODevice@WebCore@@UAEPAXPBD@Z)
    QNetworkReplyHandler.obj : error LNK2001: 无法解析的外部符号 "public: virtual in
    t __thiscall WebCore::FormDataIODevice::qt_metacall(enum QMetaObject::Call,int,v
    oid * *)" (?qt_metacall@FormDataIODevice@WebCore@@UAEHW4Call@QMetaObject@@HPAPAX
    @Z)
    QNetworkReplyHandler.obj : error LNK2001: 无法解析的外部符号 "public: virtual st
    ruct QMetaObject const * __thiscall WebCore::QNetworkReplyHandler::metaObject(vo
    id)const " (?metaObject@QNetworkReplyHandler@WebCore@@UBEPBUQMetaObject@@XZ)
    QNetworkReplyHandler.obj : error LNK2001: 无法解析的外部符号 "public: virtual vo
    id * __thiscall WebCore::QNetworkReplyHandler::qt_metacast(char const *)" (?qt_m
    etacast@QNetworkReplyHandler@WebCore@@UAEPAXPBD@Z)
    QNetworkReplyHandler.obj : error LNK2001: 无法解析的外部符号 "public: virtual in
    t __thiscall WebCore::QNetworkReplyHandler::qt_metacall(enum QMetaObject::Call,i
    nt,void * *)" (?qt_metacall@QNetworkReplyHandler@WebCore@@UAEHW4Call@QMetaObject
    @@HPAPAX@Z)
    QNetworkReplyHandler.obj : error LNK2019: 无法解析的外部符号 "protected: void __
    thiscall WebCore::QNetworkReplyHandler::processQueuedItems(void)" (?processQueue
    dItems@QNetworkReplyHandler@WebCore@@IAEXXZ),该符号在函数 "public: void __thisc
    all WebCore::QNetworkReplyHandler::setLoadMode(enum WebCore::QNetworkReplyHandle
    r::LoadMode)" (?setLoadMode@QNetworkReplyHandler@WebCore@@QAEXW4LoadMode@12@@Z)
    中被引用
    FrameLoaderClientQt.obj : error LNK2019: 无法解析的外部符号 "protected: void __t
    hiscall QWebPage::unsupportedContent(class QNetworkReply *)" (?unsupportedConten
    t@QWebPage@@IAEXPAVQNetworkReply@@@Z),该符号在函数 "public: virtual void __this
    call WebCore::FrameLoaderClientQt::download(class WebCore::ResourceHandle *,stru
    ct WebCore::ResourceRequest const &,struct WebCore::ResourceRequest const &,clas
    s WebCore::ResourceResponse const &)" (?download@FrameLoaderClientQt@WebCore@@UA
    EXPAVResourceHandle@2@ABUResourceRequest@2@1ABVResourceResponse@2@@Z) 中被引用
    FrameLoaderClientQt.obj : error LNK2019: 无法解析的外部符号 "protected: void __t
    hiscall QWebPage::downloadRequested(class QNetworkRequest const &)" (?downloadRe
    quested@QWebPage@@IAEXABVQNetworkRequest@@@Z),该符号在函数 "public: virtual voi
    d __thiscall WebCore::FrameLoaderClientQt::startDownload(struct WebCore::Resourc
    eRequest const &)" (?startDownload@FrameLoaderClientQt@WebCore@@UAEXABUResourceR
    equest@2@@Z) 中被引用
    ........libQtWebKitd4.dll : fatal error LNK1120: 9 个无法解析的外部命令
    NMAKE : fatal error U1077: “"C:Program FilesMicrosoft Visual Studio 8VCBIN
    link.EXE"”: 返回代码“0x460”
    Stop.
    NMAKE : fatal error U1077: “"C:Program FilesMicrosoft Visual Studio 8VCBIN
    nmake.exe"”: 返回代码“0x2”
    Stop.
    NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
    Stop.
    复制代码

     解决方法:删除QT目录下的mocinclude.tmp文件,大致路径如下:src/3rdparty/webkit/WebCore/tmp/moc/{debug,release}_shared/mocinclude.tmp,再nmake一次,之后又出现了如下错误:

    复制代码
    代码
    apiqscriptextensionplugin.h(43): Error: Undefined interface  
    NMAKE : fatal error U1077: “C:Qt4.6.2-vcqtinmoc.exe”: 返回代码“0x1”
    Stop.
    NMAKE : fatal error U1077: “"C:Program FilesMicrosoft Visual Studio 8VCBIN
    nmake.exe"”: 返回代码“0x2”
    Stop.
    NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
    Stop.
    复制代码

     解决方法是将:qt/src/script/tmp/moc/debug_shared/mocinclude.tmp、

     qt/src/script/tmp/moc/release_shared/mocinclude.tmp删除,然后继续编译就ok了。 

    http://www.cnblogs.com/bingcaihuang/archive/2010/12/02/1894005.html

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/findumars/p/6152924.html
Copyright © 2011-2022 走看看