How to build Qt 4.8/5.2 statically under VS2012, using the static MSVC runtime, with Windows XP support?

后端 未结 2 887
无人及你
无人及你 2020-11-27 22:52

I\'d like to make a completely static build of Qt 4.8/5.2 under VS2012 - including static runtime libraries, and targeting Windows XP systems. This is not supported out-of-t

2条回答
  •  眼角桃花
    2020-11-27 23:07

    Qt 4.8

    Assuming that the environment was prepared for XP targeting, and relevant XP-targeting qt4xp.patch and the bug fix qt4fixes.patch available - both from my other answer, the following script does the job:

    :: Assume that we're in an equivalent of C:\Qt prefix
    @set PREFIX=%~dp0
    :: Qt sources
    @set QT=%PREFIX%..\4.8.5-src
    :: Patch file(s)
    @set SRC=%PREFIX%
    @set SPEC=win32-msvc2012
    @if not exist "%QT%\projects.pro" ( echo Qt source folder expected in %QT%>&2 & exit /b 1 )
    ::
    @patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt4fixes.rej --input=%SRC%\qt4fixes.patch
    ::
    @mkdir %QT%\mkspecs\%SPEC%-xp
    @copy %QT%\mkspecs\%SPEC%\qplatformdefs.h %QT%\mkspecs\%SPEC%-xp
    @copy %QT%\mkspecs\%SPEC%\qmake.conf %QT%\mkspecs\%SPEC%-xp
    @patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt4xp.rej --input=%SRC%\qt4xp.patch
    ::
    @mkdir %QT%\mkspecs\%SPEC%-static
    @copy %QT%\mkspecs\%SPEC%\qplatformdefs.h %QT%\mkspecs\%SPEC%-static
    @copy %QT%\mkspecs\%SPEC%\qmake.conf %QT%\mkspecs\%SPEC%-static
    @mkdir %QT%\mkspecs\%SPEC%-static-xp
    @copy %QT%\mkspecs\%SPEC%-xp\qplatformdefs.h %QT%\mkspecs\%SPEC%-static-xp
    @copy %QT%\mkspecs\%SPEC%-xp\qmake.conf %QT%\mkspecs\%SPEC%-static-xp
    @patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt4static.rej --input=%SRC%\qt4static.patch
    

    To undo the changes to the Qt source, run the following, with variables set as above:

    @patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt4static-unfix.rej --input=%SRC%\qt4static.patch
    @del %QT%\mkspecs\%SPEC%-static\qplatformdefs.h
    @del %QT%\mkspecs\%SPEC%-static\qmake.conf
    @rmdir %QT%\mkspecs\%SPEC%-static
    @del %QT%\mkspecs\%SPEC%-static-xp\qplatformdefs.h
    @del %QT%\mkspecs\%SPEC%-static-xp\qmake.conf
    @rmdir %QT%\mkspecs\%SPEC%-static-xp
    ::
    @patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt4xp-unfix.rej --input=%SRC%\qt4xp.patch
    @del %QT%\mkspecs\%SPEC%-xp\qplatformdefs.h
    @del %QT%\mkspecs\%SPEC%-xp\qmake.conf
    @rmdir %QT%\mkspecs\%SPEC%-xp
    ::
    @patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt4fixes-unfix.rej --input=%SRC%\qt4fixes.patch
    

    The build is then performed by executing

    configure -static -platform win32-msvc2012-static-xp (or win32-msvc2012-static)
    jom (or nmake)
    
    # qt4static.patch
    # Static MSVC Runtime Support for Qt 4.8
    #
    # Build configure with XP targeting
    --- tools/configure/configure.pro   2014-02-20 10:00:29.840317000 -0500
    +++ tools/configure/configure.pro   2014-02-20 10:03:06.674999600 -0500
    @@ -4,7 +4,7 @@
     CONFIG   += console flat stl rtti_off
     CONFIG   -= moc qt
     DEFINES  = UNICODE QT_NODLL QT_NO_CODECS QT_NO_TEXTCODEC QT_NO_UNICODETABLES QT_LITE_COMPONENT QT_NO_STL QT_NO_COMPRESS QT_NO_THREAD QT_NO_QOBJECT QT_NO_GEOM_VARIANT _CRT_SECURE_NO_DEPRECATE
    -win32-msvc2012-xp: DEFINES += _USING_V110_SDK71_
    +win32-msvc2012-xp|win32-msvc2012-static-xp: DEFINES += _USING_V110_SDK71_
     DEFINES  += QT_BOOTSTRAPPED
     
     win32 : LIBS += -lole32 -ladvapi32
    # Add support for static qmake specs.
    --- qmake/Makefile.win32    2013-06-07 09:17:02.000000000 -0400
    +++ qmake/Makefile.win32    2014-02-20 09:31:51.090426700 -0500
    @@ -1,4 +1,4 @@
    -!IF "$(QMAKESPEC)" == "win32-msvc" || "$(QMAKESPEC)" == "win32-msvc.net" || "$(QMAKESPEC)" == "win32-msvc2002" || "$(QMAKESPEC)" == "win32-msvc2003" || "$(QMAKESPEC)" == "win32-msvc2005" || "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-icc"
    +!IF "$(QMAKESPEC)" == "win32-msvc" || "$(QMAKESPEC)" == "win32-msvc.net" || "$(QMAKESPEC)" == "win32-msvc2002" || "$(QMAKESPEC)" == "win32-msvc2003" || "$(QMAKESPEC)" == "win32-msvc2005" || "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-msvc2012-static" || "$(QMAKESPEC)" == "win32-msvc2012-static-xp" || "$(QMAKESPEC)" == "win32-icc"
     
     !if "$(SOURCE_PATH)" == ""
     SOURCE_PATH = ..
    @@ -42,9 +42,9 @@
                   -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP -DQT_BUILD_QMAKE -DQT_NO_THREAD \
                   -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM -DQT_NO_PCRE -DQT_BOOTSTRAPPED \
                   -DQLIBRARYINFO_EPOCROOT
    -!if "$(QMAKESPEC)" == "win32-msvc2012-xp"
    -CFLAGS_BARE = $(CFLAGS_BARE) -D_USING_V110_SDK71_
    -!endif
    +!if "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-msvc2012-static-xp"
    +CFLAGS_BARE = $(CFLAGS_BARE) -D_USING_V110_SDK71_
    +!endif
     CFLAGS   = -Yuqmake_pch.h -FIqmake_pch.h -Fpqmake_pch.pch $(CFLAGS_BARE) $(CFLAGS)
     
     CXXFLAGS_BARE = $(CFLAGS_BARE)
    # Set static runtime
    --- mkspecs/win32-msvc2012-static/qmake.conf    2013-06-07 09:17:00.000000000 -0400
    +++ mkspecs/win32-msvc2012-static/qmake.conf    2014-02-17 16:17:38.831119700 -0500
    @@ -19,9 +19,9 @@
     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_RELEASE    = -O2 -MT
    +QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -d2Zi+
    +QMAKE_CFLAGS_DEBUG      = -Zi -MTd -d2Zi+
     QMAKE_CFLAGS_YACC       =
     QMAKE_CFLAGS_LTCG       = -GL
     QMAKE_CFLAGS_MP         = -MP
    # Set static runtime
    --- mkspecs/win32-msvc2012-static-xp/qmake.conf 2013-06-07 09:17:00.000000000 -0400
    +++ mkspecs/win32-msvc2012-static-xp/qmake.conf 2014-02-17 16:17:38.831119700 -0500
    @@ -19,9 +19,9 @@
     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_RELEASE    = -O2 -MT
    +QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -d2Zi+
    +QMAKE_CFLAGS_DEBUG      = -Zi -MTd -d2Zi+
     QMAKE_CFLAGS_YACC       =
     QMAKE_CFLAGS_LTCG       = -GL
     QMAKE_CFLAGS_MP         = -MP
    

提交回复
热议问题