zoukankan      html  css  js  c++  java
  • VS2010编译Qt5.4.0静态库

    http://www.kavenblog.com/?p=375

    1、Qt的跨平台十分优秀,但是在Windows上是还是会有许多问题,其中之一就是动态链接库的问题,Qt程序的发布必须带一个体积不小的DLL库,这十分不方便。当然,如果是程序员之间会比较方便,如果别人的机子也安装了Qt,并且设置了环境变量,那么也可以不将公共的DLL附在发布的程序中。但是,这样显然还是不方便。

    2、静态链接库很好的解决了这一个问题,下面就来详细叙述如何编译Qt5.4.0的静态库。

    3、参考链接:http://blog.csdn.net/wwkaven/article/details/37668859

    4、下载Qt源码:

    clipboard

    下载地址:http://111.11.184.43/mirrors.ustc.edu.cn/qtproject/archive/qt/5.4/5.4.0/single/qt-everywhere-opensource-src-5.4.0.zip

    5、安装Python

    https://www.python.org/downloads/

    https://www.python.org/ftp/python/3.4.3/python-3.4.3.msi

    clipboard[1]

    clipboard[2]

    clipboard[3]

    clipboard[4]

    clipboard[5]

    clipboard[6]

    clipboard[7]

    clipboard[8]

    clipboard[9]

    6、解压Qt源码:

    clipboard[10]

    clipboard[11]

    7、进入这个文件夹:qt-everywhere-opensource-src-5.4.0qtbasemkspecs

    clipboard[12]

    8、进入这个文件夹:qt-everywhere-opensource-src-5.4.0qtbasemkspecswin32-msvc2010,里面有两个文件:

    clipboard[13]

    9、打开qmake.conf,修改内容并保存,如下:

    原始内容如下(注意红色部分):

    #

    # qmake configuration for win32-msvc2010

    #

    # Written for Microsoft Visual C++ 2010

    #

    MAKEFILE_GENERATOR      = MSBUILD

    QMAKE_PLATFORM          = win32

    CONFIG                 += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe

    DEFINES                += UNICODE WIN32

    MSVC_VER                = 10.0

    QMAKE_COMPILER_DEFINES += _MSC_VER=1600 _WIN32

    contains(QMAKE_TARGET.arch, x86_64) {

        DEFINES += WIN64

        QMAKE_COMPILER_DEFINES += _WIN64

    }

    QMAKE_COMPILER          = msvc

    QMAKE_CC                = cl

    QMAKE_LEX               = flex

    QMAKE_LEXFLAGS          =

    QMAKE_YACC              = byacc

    QMAKE_YACCFLAGS         = -d

    QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t

    QMAKE_CFLAGS_WARN_ON    = -W3

    QMAKE_CFLAGS_WARN_OFF   = -W0

    QMAKE_CFLAGS_RELEASE    = -O2 -MD

    QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi

    QMAKE_CFLAGS_DEBUG      = -Zi -MDd

    QMAKE_CFLAGS_YACC       =

    QMAKE_CFLAGS_LTCG       = -GL

    QMAKE_CFLAGS_MP         = -MP

    QMAKE_CFLAGS_SSE2       = -arch:SSE2

    QMAKE_CFLAGS_SSE3       = -arch:SSE2

    QMAKE_CFLAGS_SSSE3      = -arch:SSE2

    QMAKE_CFLAGS_SSE4_1     = -arch:SSE2

    QMAKE_CFLAGS_SSE4_2     = -arch:SSE2

    QMAKE_CFLAGS_AVX        = -arch:AVX

    QMAKE_CFLAGS_AVX2       = -arch:AVX

    QMAKE_CXX               = $$QMAKE_CC

    QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS

    QMAKE_CXXFLAGS_WARN_ON  = $$QMAKE_CFLAGS_WARN_ON -w34100 -w34189

    QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF

    QMAKE_CXXFLAGS_RELEASE  = $$QMAKE_CFLAGS_RELEASE

    QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO

    QMAKE_CXXFLAGS_DEBUG    = $$QMAKE_CFLAGS_DEBUG

    QMAKE_CXXFLAGS_YACC     = $$QMAKE_CFLAGS_YACC

    QMAKE_CXXFLAGS_LTCG     = $$QMAKE_CFLAGS_LTCG

    QMAKE_CXXFLAGS_MP       = $$QMAKE_CFLAGS_MP

    QMAKE_CXXFLAGS_STL_ON   = -EHsc

    QMAKE_CXXFLAGS_STL_OFF  =

    QMAKE_CXXFLAGS_RTTI_ON  = -GR

    QMAKE_CXXFLAGS_RTTI_OFF =

    QMAKE_CXXFLAGS_EXCEPTIONS_ON = -EHsc

    QMAKE_CXXFLAGS_EXCEPTIONS_OFF =

    QMAKE_INCDIR            =

    QMAKE_RUN_CC            = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$obj $src

    QMAKE_RUN_CC_IMP        = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<

    QMAKE_RUN_CC_IMP_BATCH  = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ @<<

    QMAKE_RUN_CXX           = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$obj $src

    QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<

    QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<

    QMAKE_LINK              = link

    QMAKE_LFLAGS            = /NOLOGO /DYNAMICBASE /NXCOMPAT

    QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO

    QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO

    QMAKE_LFLAGS_DEBUG      = /DEBUG

    QMAKE_LFLAGS_CONSOLE    = /SUBSYSTEM:CONSOLE

    QMAKE_LFLAGS_WINDOWS    = /SUBSYSTEM:WINDOWS

    QMAKE_LFLAGS_EXE        = "/MANIFESTDEPENDENCY:type=’win32’ name=’Microsoft.Windows.Common-Controls’ version=’6.0.0.0’ publicKeyToken=’6595b64144ccf1df’ language=’*’ processorArchitecture=’*’"

    QMAKE_LFLAGS_DLL        = /DLL

    QMAKE_LFLAGS_LTCG       = /LTCG

    QMAKE_EXTENSION_STATICLIB = lib

    QMAKE_LIBS_CORE         = kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib

    QMAKE_LIBS_GUI          = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib user32.lib advapi32.lib

    QMAKE_LIBS_NETWORK      = ws2_32.lib

    QMAKE_LIBS_OPENGL       = glu32.lib opengl32.lib gdi32.lib user32.lib

    QMAKE_LIBS_OPENGL_ES2   = libEGL.lib libGLESv2.lib gdi32.lib user32.lib

    QMAKE_LIBS_OPENGL_ES2_DEBUG = libEGLd.lib libGLESv2d.lib gdi32.lib user32.lib

    QMAKE_LIBS_COMPAT       = advapi32.lib shell32.lib comdlg32.lib user32.lib gdi32.lib ws2_32.lib

    QMAKE_LIBS_QT_ENTRY     = -lqtmain

    QMAKE_IDL               = midl

    QMAKE_LIB               = lib /NOLOGO

    QMAKE_RC                = rc

    include(../common/shell-win32.conf)

    VCPROJ_EXTENSION        = .vcxproj

    VCSOLUTION_EXTENSION    = .sln

    VCPROJ_KEYWORD          = Qt4VSv1.0

    load(qt_config)

    修改红色部分,将MD(动态)改为MT(静态)

    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

    保存文件

    10、以管理员身份打开VS2010的命令提示工具:

    clipboard[14]

    clipboard[15]

    输入python,查看Python的状态:

    clipboard[16]

    如果是这样,需要设动设置Python的环境变量:

    clipboard[17]

    set PATH=%PATH%;C:Python34

    按下“Ctrl+z”,再回车,退出Python

    clipboard[18]

    CD至Qt源码的解压目录:

    clipboard[19]

    11、关键步骤,Configure

    输入:

    configure -mp -confirm-license -opensource -platform win32-msvc2010 -debug-and-release -static -prefix "D:QT_Staticqt-static-5.4.0" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebkit

    clipboard[20]

    回车:

    clipboard[21]

    一会之后:

    clipboard[22]

    12、执行nmake

    clipboard[23]

    回车

    clipboard[24]

    接下去就是漫长的编译过程了, 等待中。。。。。。

    clipboard[25]

    编译完成

    clipboard[26]

    编译完后的文件夹大小:

    clipboard[27]

    13、执行nmake install

    clipboard[28]

    完成

    clipboard[29]

    安装目录:

    clipboard[30]

    clipboard[31]

    14、配置静态库

    clipboard[32]

    clipboard[33]

    clipboard[34]

    clipboard[35]

    clipboard[36]

    clipboard[37]

    发现有一个警告,暂时忽略:

    clipboard[38]

    15、创建测试项目

    选择静态编译器:

    clipboard[39]

    以下是编译输出:

    13:44:17: 为项目StaticTest执行步骤 …

    13:44:17: 正在启动 "D:QT_Staticqt-static-5.4.0inqmake.exe" D:DocumentsQTStaticTestStaticTest.pro -r -spec win32-msvc2010

    13:44:18: 进程"D:QT_Staticqt-static-5.4.0inqmake.exe"正常退出。

    13:44:18: 正在启动 "C:QtQt5.4.0ToolsQtCreatorinjom.exe"

    C:QtQt5.4.0ToolsQtCreatorinjom.exe -f Makefile.Debug

    D:QT_Staticqt-static-5.4.0inuic.exe ..StaticTestdialog.ui -o ui_dialog.h

    cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MTd -GR -W3 -w34100 -w34189 -EHsc /FddebugStaticTest.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"......QT_Staticqt-static-5.4.0include" -I"......QT_Staticqt-static-5.4.0includeQtWidgets" -I"......QT_Staticqt-static-5.4.0includeQtGui" -I"......QT_Staticqt-static-5.4.0includeQtCore" -I"debug" -I"." -I"." -I"......QT_Staticqt-static-5.4.0mkspecswin32-msvc2010" -Fodebug @C:UsersKavenAppDataLocalTempmain.obj.9692.0.jom

    main.cpp

    cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MTd -GR -W3 -w34100 -w34189 -EHsc /FddebugStaticTest.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"......QT_Staticqt-static-5.4.0include" -I"......QT_Staticqt-static-5.4.0includeQtWidgets" -I"......QT_Staticqt-static-5.4.0includeQtGui" -I"......QT_Staticqt-static-5.4.0includeQtCore" -I"debug" -I"." -I"." -I"......QT_Staticqt-static-5.4.0mkspecswin32-msvc2010" -Fodebug @C:UsersKavenAppDataLocalTempstatictest_plugin_import.obj.9692.15.jom

    statictest_plugin_import.cpp

    D:QT_Staticqt-static-5.4.0inmoc.exe -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1600 -D_WIN32 -ID:/QT_Static/qt-static-5.4.0/mkspecs/win32-msvc2010 -ID:/Documents/QT/StaticTest -ID:/QT_Static/qt-static-5.4.0/include -ID:/QT_Static/qt-static-5.4.0/include/QtWidgets -ID:/QT_Static/qt-static-5.4.0/include/QtGui -ID:/QT_Static/qt-static-5.4.0/include/QtCore -I. ..StaticTestdialog.h -o debugmoc_dialog.cpp

    cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MTd -GR -W3 -w34100 -w34189 -EHsc /FddebugStaticTest.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"......QT_Staticqt-static-5.4.0include" -I"......QT_Staticqt-static-5.4.0includeQtWidgets" -I"......QT_Staticqt-static-5.4.0includeQtGui" -I"......QT_Staticqt-static-5.4.0includeQtCore" -I"debug" -I"." -I"." -I"......QT_Staticqt-static-5.4.0mkspecswin32-msvc2010" -Fodebug @C:UsersKavenAppDataLocalTempdialog.obj.9692.343.jom

    dialog.cpp

    cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MTd -GR -W3 -w34100 -w34189 -EHsc /FddebugStaticTest.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"......QT_Staticqt-static-5.4.0include" -I"......QT_Staticqt-static-5.4.0includeQtWidgets" -I"......QT_Staticqt-static-5.4.0includeQtGui" -I"......QT_Staticqt-static-5.4.0includeQtCore" -I"debug" -I"." -I"." -I"......QT_Staticqt-static-5.4.0mkspecswin32-msvc2010" -Fodebug @C:UsersKavenAppDataLocalTempmoc_dialog.obj.9692.609.jom

    moc_dialog.cpp

    echo 1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ "debug\StaticTest.exe.embed.manifest">debugStaticTest.exe_manifest.rc

    if not exist debugStaticTest.exe if exist debugStaticTest.exe.embed.manifest del debugStaticTest.exe.embed.manifest

    if exist debugStaticTest.exe.embed.manifest copy /Y debugStaticTest.exe.embed.manifest debugStaticTest.exe_manifest.bak

    link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type=’win32′ name=’Microsoft.Windows.Common-Controls’ version=’6.0.0.0′ publicKeyToken=’6595b64144ccf1df’ language=’*’ processorArchitecture=’*’" /MANIFEST /MANIFESTFILE:debugStaticTest.exe.embed.manifest /OUT:debugStaticTest.exe @C:UsersKavenAppDataLocalTempStaticTest.exe.9692.2297.jom

    正在创建库 debugStaticTest.lib 和对象 debugStaticTest.exp

    if exist debugStaticTest.exe_manifest.bak fc /b debugStaticTest.exe.embed.manifest debugStaticTest.exe_manifest.bak >NUL || del debugStaticTest.exe_manifest.bak

    if not exist debugStaticTest.exe_manifest.bak rc.exe /fodebugStaticTest.exe_manifest.res debugStaticTest.exe_manifest.rc

    Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385

    Copyright (C) Microsoft Corporation. All rights reserved.

    if not exist debugStaticTest.exe_manifest.bak link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type=’win32′ name=’Microsoft.Windows.Common-Controls’ version=’6.0.0.0′ publicKeyToken=’6595b64144ccf1df’ language=’*’ processorArchitecture=’*’" /MANIFEST /MANIFESTFILE:debugStaticTest.exe.embed.manifest /OUT:debugStaticTest.exe @C:UsersKavenAppDataLocalTempStaticTest.exe.9692.2312.jom

    正在创建库 debugStaticTest.lib 和对象 debugStaticTest.exp

    if exist debugStaticTest.exe_manifest.bak del debugStaticTest.exe_manifest.bak

    13:44:42: 进程"C:QtQt5.4.0ToolsQtCreatorinjom.exe"正常退出。

    13:44:42: Elapsed time: 00:26.

    运行:

    clipboard[40]

    看一下生成的程序信息:

    clipboard[41]

    16、用VS打开项目

    clipboard[42]

    clipboard[43]

    VS编译项目:

    编译输出如下:

    1>—— 已启动生成: 项目: StaticTest, 配置: Debug Win32 ——

    1>生成启动时间为 2015/3/13 13:53:15。

    1>PrepareForBuild:

    1>  正在创建目录“debug”。

    1>InitializeBuildStatus:

    1>  正在创建“Win32DebugStaticTest.unsuccessfulbuild”,因为已指定“AlwaysCreate”。

    1>CustomBuild:

    1>  Moc’ing dialog.h…

    1>  Uic’ing dialog.ui…

    1>ClCompile:

    1>  dialog.cpp

    1>  moc_dialog.cpp

    1>  main.cpp

    1>  正在生成代码…

    1>Link:

    1>  StaticTest.vcxproj -> D:DocumentsQTStaticTestdebugStaticTest.exe

    1>FinalizeBuildStatus:

    1>  正在删除文件“Win32DebugStaticTest.unsuccessfulbuild”。

    1>  正在对“Win32DebugStaticTest.lastbuildstate”执行 Touch 任务。

    1>

    1>生成成功。

    1>

    1>已用时间 00:00:05.15

    ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

    注意:此时用VS生成的项目还是用的动态库,因为未将静态库添加到VS中。

    同上方法,将编译好的静态库也添加到VS设置中的Qt版本中:

    clipboard[44]

    clipboard[45]

    clipboard[46]

    然后,右键项目,Qt Project Settings

    clipboard[47]

    clipboard[48]

    编译:

    1>—— 已启动生成: 项目: StaticTest, 配置: Debug Win32 ——

    1>生成启动时间为 2015/3/13 15:11:27。

    1>PrepareForBuild:

    1>  正在创建目录“debug”。

    1>InitializeBuildStatus:

    1>  正在创建“Win32DebugStaticTest.unsuccessfulbuild”,因为已指定“AlwaysCreate”。

    1>CustomBuild:

    1>  Moc’ing dialog.h…

    1>  Uic’ing dialog.ui…

    1>ClCompile:

    1>  dialog.cpp

    1>  moc_dialog.cpp

    1>  main.cpp

    1>  statictest_plugin_import.cpp

    1>  正在生成代码…

    1>Link:

    1>     正在创建库 debug\StaticTest.lib 和对象 debug\StaticTest.exp

    1>  StaticTest.vcxproj -> D:DocumentsQTStaticTestdebugStaticTest.exe

    1>FinalizeBuildStatus:

    1>  正在删除文件“Win32DebugStaticTest.unsuccessfulbuild”。

    1>  正在对“Win32DebugStaticTest.lastbuildstate”执行 Touch 任务。

    1>

    1>生成成功。

    1>

    1>已用时间 00:00:14.37

    ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

    clipboard[49]

    OK,本篇结束。

  • 相关阅读:
    使用FreeTextBox等控件带来的问题
    DoNet分页控件
    享元模式学习后总结!(见到别人的总结,解我心中迷惑,认可)
    基于工作流平台的ITSM系统
    .net工作流在移动公司的部署
    转载:When Office 2003 couldn’t find file SKU011.CAB Office 2003 reinstallation error
    联通公司代理商佣金管理
    知识管理系统分析之一:网络蜘蛛的分析
    自我介绍像猪一样生活
    知识管理的整体架构
  • 原文地址:https://www.cnblogs.com/Travis990/p/4453445.html
Copyright © 2011-2022 走看看