• 27504阅读
  • 11回复

[折腾成功] VS2008 Express 编译QT4.5.3 shared + static + openssl [复制链接]

上一主题 下一主题
离线sagaxu
 
只看楼主 倒序阅读 楼主  发表于: 2009-10-04
— 本帖被 XChinux 设置为精华(2009-10-07) —
适合需要 shared+static 共存的人参考,其余情况,官方手册应该是最好的。

VC最好从VC提供的控制台启动,自己打开的VC终端,可能会因为环境变量不全引起编译错误,
光设置PATH环境变量没有用。建议执行一次 vcvarsall.bat 初始化环境变量。官方终端打开的是:
%comspec% /k ""C:\software\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86
因你的VC安装目录而不同。参数除X86外,还有 amd64 x64 ia64 x86_amd64 x86_ia64等。


准备工作:
1. 下载 VC++2008 SP1 英文 express 版, 中文版可能有问题,安装好备用。
2. 下载 windows 版的 perl,当前最新版是 strawberry-perl-5.10.0.6,解压备用。
3. 下载 QT4.5.3的源码,qt-all-opensource-src-4.5.3(不是sdk那个exe),解压备用。
4. 下载OpenSSL源码,当前最新版是 openssl-0.9.8k,解压备用。



第一部分:编译OpenSSL

1. 安装perl
2. 打开带有VC2008环境的console
3. 进入到 openssl 源码树的目录
4. perl Configure VC-WIN32
5. ms\do_ms.bat
6. nmake -f ms\ntdll.mak
7. nmake -f ms\nt.mak

ntdll.mak是编译dll,nt.mak是lib,如果漏掉4,会报错。



第二部分:安装 shared build 的QT

新建 C:\Software\QT45\qt 目录,其它目录也可以,只要路径中不含空格或中文。
复制 源码目录下的 mkspecs 目录到新建的qt目录,否则会报错。

配置 shared 版:
configure -debug-and-release -platform win32-msvc2008
-no-dsp -no-vcproj -no-qt3support -qt-libpng -qt-libjpeg
-qt-libmng -qt-libtiff -qt-zlib  -prefix  C:\Software\Qt45\qt
-openssl -I D:\download\openssl-0.9.8k\inc32
-L d:\download\openssl-0.9.8k\out32dll  -nomake translations

之前 openssl 只是编译了一下,没有安装,include目录是空的,配置的时候,要根据实际情况,给出
正确的include和lib目录。-platform 参数指出了目标编译器,在 mkspecs 下可看到非常多的编译器,
有些编译器无法编译webkit组件,有些则无法编译 phonon,vs2008是全部都可以的。

不打算开发 webkit 核心的浏览器人,建议不要编译webkit,此物极度耗时,体积也不小
光一个static配置的lib文件,release超过200M,debug接近500M。

隐藏参数 -nomake, 忽略某些buildpart,参考 tools\configure\configureapp.cpp 文件。
以下6个buildparts: libs,  tools,  examples,  demos,  docs,  translations  可以忽略掉,
(translations是语言文件,忽略的话,-prefix\bin下的工具就只有英文了)


完事后编译:
nmake

完事后安装:
nmake install

openssl 源码下找 libeay32.dll 和 ssleay32.dll ,复制到 -prefix\bin。
-prefix\bin 不会自动加入到PATH环境变量,需要的话自己设置。

至此, OpenSSL 目录可以删除。正式+调试 的动态编译版QT装完,占用磁盘379M。若要卸载,
直接删除 -prefix\ 目录。QT源码目录达4G, nmake distclean ,或整个删除以节省空间。
如需接着编译静态版,OpenSSL目录勿删。

发现安装后bug一个,原因未知,不确定是QT自身问题,还是安装方式造成的。
qt demo调用的是 examples\xxx\xxx\debug或者release下的exe程序,而现在examples编译出的程序,
都不在debug或者release目录,直接在对应源码根目录下了,修改examples的pro文件可以修正错误。



第三部分:安装 static 版的QT

configure -static 只是静态链接QT的lib,仍然需要VC2008运行库,可以到微软主页下载。

静态,就要彻底。mkspecs目录,找到 win32-msvc2008 目录,编辑qmake.conf,
将QMAKE_CFLAGS_XXXXXXX全改成静态。就是把MD改成MT,把MDd改成MTd。
源码目录下 mkspecs 和目标目录下mkspecs里的都要改,前者最后安装时会覆盖掉后者。

根据qt官方文档,在重新configure的时候,必须先做些清理:

nmake distclean

以前的老版本是用 nmake confclean,它们的语义是不同的,纠缠这些蛛丝马迹没有意义,
我直接删除了源码目录,解压纯净的源码树来编译的,纯净的源码树,有利于减少潜在编译错误。

这里只编译正式版,其它版的 configure 要作相应调整,-openssl-linked 表示静态链接,
运行时不需要带 openssl的 dll, -opensll 正好相反,运行时需要dll。

配置 static 版:
configure -release -platform win32-msvc2008 -no-dsp -no-vcproj -no-qt3support
-qt-libpng -qt-libjpeg -qt-libmng -qt-libtiff -qt-zlib -prefix C:\Software\Qt45\qts
-openssl-linked -I D:\download\openssl-0.9.8k\inc32 -L d:\download\openssl-0.9.8k
\out32 -nomake examples -nomake docs -nomake demos -nomake translations  -static

配置完后:
编辑 tools\xmlpatterns\makefile.RELEASE ,把gdi32.lib加上,否则xmlpatterns会报错。

编译:
nmake

安装:
nmake install

安装OpenSSL的库:
复制 d:\download\openssl-0.9.8k\out32\ 下的两个lib文件 -prefix\lib 下。

修正一些错误:
-prefix\lib\*.prl,QMAKE_PRL_LIBS 变量中,OpenSSL源码目录,QT自身的源码,都要清除出去。
前者会造成qmake生成的makefile依赖openssl目录,后者可能造成QT依赖自身的源码树。工作量
非常巨大,几十个文件,慢慢改,我用的vim,写个正则自动处理了。



第四部分:编写测试代码

test.cpp 如下:
#include <QSslSocket>
#include <iostream>
#include <QString>
int main()
{
    QSslSocket socket;
    socket.connectToHostEncrypted("mail.qq.com", 443);
    if (!socket.waitForEncrypted()) {
        std::cout<<"ERROR"<<socket.errorString().toStdString();
     return false;
    }
    std::cout<<"Connect SUCC"<<std::endl;
    socket.write("GET / HTTP/1.1\r\n\r\n");
    while (socket.waitForReadyRead())
        std::cout<< socket.readAll().data();
}

test.pro如下:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
QT  += network
SOURCES += test.cpp
CONFIG  += console  release


预期的输出结果是
Connect SUCC
HTTP/1.0 200 OK
Server: TWS
Date: Sat, 03 Oct 2009 18:44:08 GMT
Expires: Sat, 03 Oct 2009 22:44:08 GMT
Cache-Control: max-age=14400
Content-Type: text/html
Content-Length: 95
Last-Modified: Tue, 24 Mar 2009 16:03:37 GMT
Age: 3230
X-Cache: HIT from m50.mail.qq.com
Via: 1.0 m50.mail.qq.com (squid/3.0.STABLE13)
Connection: close

<html>
<head>
<meta http-equiv="refresh" content="0; url=/cgi-bin/loginpage">
</head>
</html>

内容由mail.qq.com提供,可能会有所变化。



第五部分:测试 shared build 环境
C:\Software\QT45\qt\bin\qmake
nmake
运行,可能会报以下错误,别紧张,可能是找不到 openssl 的dll
QSslSocket: cannot call unresolved function SSLv3_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
QSslSocket: cannot call unresolved function ERR_error_string
可以复制前面提到的两个OpenSSL的dll文件,到temp.exe所在目录


第六部分:测试 static build 环境
C:\Software\QT45\qts\bin\qmake
nmake clean && nmake
运行看结果



第七部分:为vim添加QT类库的自动补全

先配置好vim,并且确保ctags.exe在PATH下能找到,然后:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q C:\Software\Qt45\qt\include
生成了一个接近18M的tags文件,把这个文件复制到C:\Software\Qt45\
在vim的配置文件中,把 C:\Software\Qt45\tags 添加进 tags 变量,建议不要这么做,因为
QT的tags有18M,并非所有的项目都需要QT,可以绑定到快捷键,需要的时候再打开QT自动补全。
[ 此帖被sagaxu在2009-10-04 19:57重新编辑 ]
离线halosky
只看该作者 1楼 发表于: 2009-10-04
我是中文版express2008,我机器里还安装了英文版的2005,第一步就不成功,找不到stddef.h。。。
离线sagaxu
只看该作者 2楼 发表于: 2009-10-04
stddef.h是C语言标准库,可能是控制台终端下的环境变量设置不对
离线halosky
只看该作者 3楼 发表于: 2009-10-04
路径加上了,这个问题解决了,顺利编出qmake.exe
然而执行nmake的时候,运行moc.exe又出错了,0xc0000135错误。请问是怎么回事啊?
离线halosky
只看该作者 4楼 发表于: 2009-10-04
奇怪了,我把sdk自带的那个moc.exe覆盖过去,就可以了。。。
正在狂编译中
离线halosky
只看该作者 5楼 发表于: 2009-10-04
终于安装成功了。。。但是还是不明白为什么之前自动生成的moc.exe不能用。。希望高手解答下
离线sagaxu
只看该作者 6楼 发表于: 2009-10-04
引用第3楼halosky于2009-10-04 17:48发表的  :
路径加上了,这个问题解决了,顺利编出qmake.exe
然而执行nmake的时候,运行moc.exe又出错了,0xc0000135错误。请问是怎么回事啊?


0xc0000135是cl的return value吗?
确保源码树干净,环境变量设置正确,光设置PATH是不够的
离线halosky
只看该作者 7楼 发表于: 2009-10-04
引用第6楼sagaxu于2009-10-04 19:37发表的  :
0xc0000135是cl的return value吗?
确保源码树干净,环境变量设置正确,光设置PATH是不够的


不是cl的,是moc.exe的return value
离线paul_huang
只看该作者 8楼 发表于: 2009-10-06
真是折腾啊。。。
为什么QT的安装做不到像其他软件那样简单的一个安装包就行了呢?仅仅是因为要适应多平台的原因?
离线XChinux

只看该作者 9楼 发表于: 2009-10-07
平台、编译器太多了,要不然就得像ICE那样,提供N个平台N个编译器的编译好的包。Qt支持的比ICE多出很多。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线peek
只看该作者 10楼 发表于: 2009-12-25
为何我编译的时候说找不到inc32.lib?

网上搜遍了,没有人出这个问题。诚心求教,下面是出错信息。

===================================================
Microsoft (R) 程序维护实用工具 9.00.21022.08 版
版权所有 (C) Microsoft Corporation。保留所有权利。

        cl -c -nologo -Zm200 -Zc:wchar_t- -O2 -MD -GR -EHsc -W3 -w34100 -w34189
-DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_MOC -DQT_BOOTSTRAPPED -DQT_LITE_UN
ICODE -DQT_TEXTCODEC -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CODEC
S -DQT_NO_DATASTREAM -DQT_NO_GEOM_VARIANT -DQT_NO_LIBRARY -DQT_NO_QOBJECT -DQT_N
O_STL -DQT_NO_SYSTEMLOCALE -DQT_NO_TEXTSTREAM -DQT_NO_THREAD -DQT_NO_UNICODETABL
ES -DQT_NO_USING_NAMESPACE -DQT_NODLL -I"." -I"." -I"..\..\..\include" -I"..\..\
..\include\QtCore" -I"..\..\..\include\QtXml" -I"..\..\xml" -I"..\..\..\mkspecs\
win32-msvc2008" -Forelease\ @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\nm526.tmp
moc.cpp
preprocessor.cpp
generator.cpp
parser.cpp
token.cpp
main.cpp
正在生成代码...
        link /NOLOGO /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFEST /MANIFESTFILE:
"release\moc.intermediate.manifest" /OUT:..\..\..\bin\moc.exe @C:\DOCUME~1\ADMIN
I~1\LOCALS~1\Temp\nm527.tmp
LINK : fatal error LNK1181: 无法打开输入文件“D:\Qt\openssl-0.9.8l\inc32.lib”
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio 9.0\VC\BI
N\link.EXE"”: 返回代码“0x49d”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio 9.0\VC\BI
N\nmake.exe"”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “cd”: 返回代码“0x2”
Stop.
离线zzh

只看该作者 11楼 发表于: 2012-04-10
希望楼主尽快推出VS2010 Express sp1版的编译4.8.1方法
快速回复
限100 字节
 
上一个 下一个