Windows中使用Qt5.9.0静态库构建应用

在Windows下使用VS2015和CMake构建基于 Qt5.9.0静态库的应用程序.

准备Qt5.9.0静态库

请参考文章 VisualStudio编译Qt5.9.0静态库

使用VS2015与Qt5.9.0静态库构建应用

安装插件Qt5Package或Qt Visual Studio Tools

首先确认VS2015安装有插件 Qt5Package 或者Qt官方的插件Qt Visual Studio Tools 没有的话到 "扩展和更新" 中寻找这两个插件.

配置项目

使用插件提供的模板,为了使用静态库,需要增加以下配置:

  1. 在项目中找到main函数所在文件,在文件开头插入下面的代码,用于导入平台扩展库的头文件
#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)

  1. 在 "链接器" -> "常规" -> "附加库目录" 中,添加 "$(QTDIR)\plugins\platforms" 这个目录.这个目录中是平台扩展库.

  2. 在 "链接器" -> "输入" -> "附加依赖项" 中填写以下这些项.

debug版本

qtmaind.lib     
Qt5Cored.lib    
Qt5Guid.lib    
Qt5Widgetsd.lib    
    
Qt5PlatformCompositorSupportd.lib    
Qt5FontDatabaseSupportd.lib    
Qt5ThemeSupportd.lib    
Qt5AccessibilitySupportd.lib    
Qt5EventDispatcherSupportd.lib    
qtlibpngd.lib    
qtpcre2d.lib    
qtfreetyped.lib    
qtharfbuzzd.lib    
    
qminimald.lib    
qoffscreend.lib    
qwindowsd.lib    
qdirect2dd.lib    
    
imm32.lib    
winmm.lib    
Dwmapi.lib    
UxTheme.lib    
Mincore.lib    
version.lib    
ws2_32.lib    

release版本

qtmain.lib    
Qt5Core.lib    
Qt5Gui.lib    
Qt5Widgets.lib    
    
Qt5PlatformCompositorSupport.lib    
Qt5FontDatabaseSupport.lib    
Qt5ThemeSupport.lib    
Qt5AccessibilitySupport.lib    
Qt5EventDispatcherSupport.lib    
qtlibpng.lib    
qtpcre2.lib    
qtfreetype.lib    
qtharfbuzz.lib    
    
qwindows.lib    
qoffscreen.lib    
qdirect2d.lib    
qminimal.lib    
    
imm32.lib    
winmm.lib    
Dwmapi.lib    
UxTheme.lib    
Mincore.lib    
version.lib    
ws2_32.lib    

  1. 根据使用的Qt5.9.0静态库的编译选项 MT 或 MD,在 "代码生成" -> "运行库" 中选择 MT 或 MD.

  2. 设置完毕,编译通过就行了.

使用CMake与Qt5.9.0静态库构建Qt应用

概述

Qt5对CMake的支持相当好(或者反过来说CMake对Qt5的支持也很好),经过简单配置,CMake就可以做为Qt5的构建工具.
之前以为使用cmake构建qt应用会非常麻烦,需要自己调用moc和指定UI文件的编译过程.其实Qt5的库中已经提供方便使用cmake的模块与宏命令.
例如:

详情请参考Qt官方文档 Qt 5.9 CMake Manual 与CMake官方文档cmake-qt

实例

创建文件

  1. 在项目目录中创建文件 qt590static_test.h.

    // qt590static_test.h.
    #ifndef QT590STATIC_TEST_H
    #define QT590STATIC_TEST_H
    
    #include <QtWidgets/QMainWindow>
    #include "ui_qt590static_test.h"
    
    class qt590static_test : public QMainWindow
    {
        Q_OBJECT
    
    public:
        qt590static_test(QWidget *parent = 0);
        ~qt590static_test();
    
    private:
        Ui::qt590static_testClass ui;
    };
    
    #endif    
    

  2. 创建文件 qt590static_test.cpp

    // qt590static_test.cpp
    #include "qt590static_test.h"
    
    qt590static_test::qt590static_test(QWidget *parent)
        : QMainWindow(parent)
    {
        ui.setupUi(this);
    }
    
    qt590static_test::~qt590static_test()
    {
    
    }
    

  3. 使用Qt Designer 创建文件qt590static_test.ui.
    也可以直接创建qt590static_test.ui文件

    <UI version="4.0" >
        <class>qt590static_testClass</class>
        <widget class="QMainWindow" name="qt590static_testClass" >
            <property name="objectName" >
                <string notr="true">qt590static_testClass</string>
            </property>
            <property name="geometry" >
                <rect>
                    <x>0</x>
                    <y>0</y>
                    <width>600</width>
                    <height>400</height>
                </rect>
            </property>
            <property name="windowTitle" >
            <string>qt590static_test</string>
            </property>
        <widget class="QMenuBar" name="menuBar" />
        <widget class="QToolBar" name="mainToolBar" />
        <widget class="QWidget" name="centralWidget" />
        <widget class="QStatusBar" name="statusBar" />
        </widget>
        <layoutDefault spacing="6" margin="11" />
        <pixmapfunction></pixmapfunction>
        <resources>
            <include location="qt590static_test.qrc"/>
        </resources>
        <connections/>
    </UI>
    

  4. 创建文件 main.cpp

    // main.cpp
    #include <QtPlugin>
    Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
    #include "qt590static_test.h"
    #include <QtWidgets/QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        qt590static_test w;
        w.show();
        return a.exec();
    }
    

  5. 创建CMake项目文件 CMakeLists.txt

    cmake_minimum_required(VERSION 3.0.0)
    
    #设定Qt静态库的目录位置
    set(CMAKE_PREFIX_PATH D:/Qt/Qt5.9.0_x64_static_msvc2015)
    #需要开启c++11标准
    set(CMAKE_CXX_STANDARD 11)
    # 自动将当前源代码和构建目录添加到包含路径
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    # 指示CMake在需要时自动运行moc
    set(CMAKE_AUTOMOC ON)
    
    # 查找QtWidgets包
    find_package(Qt5Widgets)
    
    project(qt590static_test)
    
    #由于是使用静态库,所以需要指定部分链接库
    set(QLIBDIR "D:/Qt/Qt5.9.0_x64_static_msvc2015/lib/")
    set(QPLADIR "D:/Qt/Qt5.9.0_x64_static_msvc2015/plugins/platforms/")
    
    if(CMAKE_BUILD_TYPE STREQUAL Debug)
        #Debug 版本需要链接的库
        set(QLIBS 
            ${QLIBDIR}Qt5PlatformCompositorSupportd.lib
            ${QLIBDIR}Qt5FontDatabaseSupportd.lib
            ${QLIBDIR}Qt5ThemeSupportd.lib
            ${QLIBDIR}Qt5AccessibilitySupportd.lib
            ${QLIBDIR}Qt5EventDispatcherSupportd.lib
            ${QLIBDIR}qtlibpngd.lib
            ${QLIBDIR}qtfreetyped.lib
            ${QLIBDIR}qtpcre2d.lib
            ${QLIBDIR}qtharfbuzzd.lib
    
            ${QPLADIR}qminimald.lib
            ${QPLADIR}qoffscreend.lib
            ${QPLADIR}qwindowsd.lib
            ${QPLADIR}qdirect2dd.lib
        )
    elseif(CMAKE_BUILD_TYPE STREQUAL Release)
        #Release 版本需要链接的库
        set(QLIBS 
            ${QLIBDIR}Qt5PlatformCompositorSupport.lib
            ${QLIBDIR}Qt5FontDatabaseSupport.lib
            ${QLIBDIR}Qt5ThemeSupport.lib
            ${QLIBDIR}Qt5AccessibilitySupport.lib
            ${QLIBDIR}Qt5EventDispatcherSupport.lib
            ${QLIBDIR}qtlibpng.lib
            ${QLIBDIR}qtfreetype.lib
            ${QLIBDIR}qtpcre2.lib
            ${QLIBDIR}qtharfbuzz.lib
    
            ${QPLADIR}qminimal.lib
            ${QPLADIR}qoffscreen.lib
            ${QPLADIR}qwindows.lib
            ${QPLADIR}qdirect2d.lib
        )
    else(CMAKE_BUILD_TYPE STREQUAL Debug)
        message(FATAL_ERROR "please set CMAKE_BUILD_TYPE = Debug | Release")
    endif(CMAKE_BUILD_TYPE STREQUAL Debug)
    
    #从ui文件创建cpp代码,需要编译的UI文件都必须使用这条宏引入项目中
    qt5_wrap_ui(ui_qt590static_test.h qt590static_test.ui)
    
    add_executable(
        qt590static_test 
        WIN32 
        main.cpp 
        qt590static_test.cpp 
        qt590static_test.ui
    )
    
    target_link_libraries(
        qt590static_test 
    
        Qt5::Widgets
    
        ${QLIBS}
    
        imm32.lib
        winmm.lib
        Dwmapi.lib
        UxTheme.lib
        Mincore.lib
        version.lib
        ws2_32.lib
    )
    

编译项目

  1. 使用 VS2015 x64 本机工具命令提示符 进入项目目录.
    最好创建构建目录build_x64_Debug 与build_x64_Release,好分开构建Debug与Release版本.

  2. 进入构建目录,例如进入build_x64_Debug 后,执行命令:

    cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug
    

    当然,也可以使用VS IDE,那么就使用命令:

    cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Debug
    
  3. 编译项目,使用命令:

    nmake
    

    或者使用VS IDE打开项目并编译.

  4. OK,构建成功