目录
4.1.2.nmake && nmake install说明
不想编译的,可以直接使用编译好的二进制文件,请参考里
qt4.8.6静态库使用环境配置https://blog.csdn.net/binary0006/article/details/138163126
1.静态编译的目标
使用qt开发的程序,在最终发布时如果是使用的qt动态库,需要把对应用到的qt动态库(QtCore.dll)跟程序放到一起才能运行。有的场景需要程序总文件数最少化,就需要将qt静态链接到程序中,这样在发布时就不需要带上qt动态库。
多编译器版本编译,qt编译出来的库文件名是相同,在编译前规划将不同编译器编译的qt库以目录的形式分离开,后续在开发中根据实际情况选择对应的版本。
Win编译区分mt和md两种形式,最终规划qt编译后的目录如下,如有其他编译器规则与此类似。(mt和md的区别自行百度)
2.运行效果
先来体验一下,最终编译后运行的效果,测试环境:没有安装VC运行时库的winxp_sp3系统。
2.1.md库运行效果
md编译方式是需要带上VC运行时库,否则运行会报错,下面截图为release编译后的程序运行效果。
第1个图,将VC运行时库目录名后面加了一个“1”,运行会报错。
第2个图,使用正常的VC运行时库目录名,程序能够正常运行启动。
2.2.mt库运行效果
mt编译方式不需要VC运行时库就能正常运行,下面编译后的程序运行效果,mt编译debug和release都能正常运行的运行。
静态编译qt后,使用qt开发的程序体积会变大,实际生产环境中静态库、动态库各有优劣,编译静态库是为实际生产中多一种选择,最终选择什么方式,以自己项目需求为准。
3.遇到的问题
3.1.qmake时提示QMAKESPEC未设置
MAKESPEC has not been set, so configuration cammot be deduced.
3.1.1产生的原因
正常情况下,是不会有这个错误的,产生这个错误的原因是把编译完成后qt库生产的目录改了导致的。qt原本编译生产的库文件在H盘,把编译生成的库文件移动到了D盘,导致在qmake的时候找不到编译时设置的路径。
这个错误显然是需要解决的,编译出来的qt库(qmake)是需要能够随意拷贝使用的。
Microsoft Windows [版本 10.0.19045.4291]
(c) Microsoft Corporation。保留所有权利。
C:\Users\******>cd /d H:\demo\qmakelibmdtest
H:\demo\qmakelibmdtest>set PATH=D:\Qt\win32_msvc2008_libmd\bin;%PATH%
H:\demo\qmakelibmdtest>qmake -r -tp vc
QMAKESPEC has not been set, so configuration cannot be deduced.
Error processing project file: H:/demo/qmakelibmdtest/qmakelibmdtest.pro
H:\demo\qmakelibmdtest>
3.1.1解决办法
修改qmake的源代码,重新编译qmake,注意只是重新编译qmake,具体需要修改的位置在编译章节中讲解。(目前发现修改源代码可以达到预期的效果,应该也有其他的方法可以达到预期,比如使用qmake的 -set <prop>命令 )
3.1.2解决后的效果
使用移动到D盘的qmake能够正常生产vs的工程,工程也能正常编译(不演示)。
4.vs2008 x86静态库编译
qt4.8.6在vs2008下编译相对来说还是比较简单的,无非就是“configure -> nmake -> nmake install”三个命令。
4.1.win32 md编译
打开vs2008的命令行工具(默认是就是x86的编译器),进入到qt的源代码目录,执行configure --help查看编译的选项参数。调整“不编译示例、修改安装位置(-prefix必须是绝对路径,自行调整)”这两个相关参数,其他的不调整。
4.1.1.configure说明
执行configure命令后,会先编译qmake,然后使用qmake来构建projects.pro工程,生成Makefile文件和vs的工程文件。
4.1.2.nmake && nmake install说明
configure执行完毕后,执行nmake开始编译,等待编译完成(编译时间由机器性能决定)。编译完成之后执行nmake install,会将编译后的文件安装到configure设置的路径中。
进入qt源代码所在目录:
4.1.3.最终执行的命令
注意修改 -prefix为自己环境的目录,configure命令执行完毕后,会在mkspecs目录下生成default目录,修改mkspecs\default\qmake.conf文件中QMAKESPEC_ORIGINAL为相对路径。
configure -opensource -confirm-license -nomake demos -nomake examples -nomake tests -prefix H:\*****\qt4.8.6\win32_msvc2008_libmd -mp -debug-and-release -static
#修改mkspecs\default\qmake.conf文件中QMAKESPEC_ORIGINAL为相对路径
nmake
nmake install
4.1.4.qmake修改
4.1.4.1.qmake源代码代码修改
前面“遇到的问题”中说过,编译qt后,拷贝qt的头文件和库文件到其他目录,使用qmake会失败,此处使用修改qmake源代码的方式来解决此问题。
\src\corelib\global\qconfig.cpp,修改8-18行代码如下
static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=..";
static const char qt_configure_documentation_path_str[512 + 12] = "qt_docspath=doc";
static const char qt_configure_headers_path_str [512 + 12] = "qt_hdrspath=include";
static const char qt_configure_libraries_path_str [512 + 12] = "qt_libspath=lib";
static const char qt_configure_binaries_path_str [512 + 12] = "qt_binspath=bin";
static const char qt_configure_plugins_path_str [512 + 12] = "qt_plugpath=plugins";
static const char qt_configure_imports_path_str [512 + 12] = "qt_impspath=imports";
static const char qt_configure_data_path_str [512 + 12] = "qt_datapath=";
static const char qt_configure_translations_path_str [512 + 12] = "qt_trnspath=translations";
static const char qt_configure_examples_path_str [512 + 12] = "qt_xmplpath=examples";
static const char qt_configure_demos_path_str [512 + 12] = "qt_demopath=demos";
\src\corelib\global\qlibraryinfo.cpp,增加482-484行代码(此处为非必改)
#if defined(_MSC_VER)
ret = ret.replace("/", "\\");
#endif
4.1.4.2.重新编译qmake
使用vs的命令行工具,进到qmake所在的目录,执行命令nmake clean && nmake,编译完成后拷贝qmake.exe到D盘对应位置,重新qmake工程会成功。
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
D:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>cd /d H:\****\qt4.8.6\qmake
H:\*****\qt4.8.6\qmake>nmake clean && nmake
Microsoft Windows [版本 10.0.19045.4291]
(c) Microsoft Corporation。保留所有权利。
C:\Users\*******>cd /d H:\demo\qmakelibmdtest
H:\demo\qmakelibmdtest>set PATH=D:\Qt\win32_msvc2008_libmd\bin;%PATH%
H:\demo\qmakelibmdtest>qmake -r -tp vc
QMAKESPEC has not been set, so configuration cannot be deduced.
Error processing project file: H:/demo/qmakelibmdtest/qmakelibmdtest.pro
H:\demo\qmakelibmdtest>qmake -r -tp vc
Reading H:/demo/qmakelibmdtest/qtgui_libmd_test/qtgui_libmd_test.pro
H:\demo\qmakelibmdtest>
4.2.win32 mt编译
4.2.1.独立源代码目录
编译mt时,将源代码重新解压一份,避免与之前md编译的混用,可能会出现莫名奇妙的错误。
4.2.2.修改配置文件
将配置文件中-MD的地方修改为-MT。
4.2.3.编译
编译的过程与md编译的相同,唯一不同的地方在于configure时设置的目录调整为mt的。具体编译过程参考md编译即可。
configure -opensource -confirm-license -nomake demos -nomake examples -nomake tests -prefix H:\*****\qt4.8.6libmt\win32_msvc2008_libmt -mp -debug-and-release -static
configure -opensource -confirm-license -nomake demos -nomake examples -nomake tests -prefix H:\*****\qt4.8.6libmt\win32_msvc2008_libmt -mp -debug-and-release -static