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 没有的话到 “扩展和更新” 中寻找这两个插件.
配置项目
使用插件提供的模板,为了使用静态库,需要增加以下配置:
- 在项目中找到main函数所在文件,在文件开头插入下面的代码,用于导入平台扩展库的头文件
#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
在 “链接器” -> “常规” -> “附加库目录” 中,添加 “$(QTDIR)\plugins\platforms” 这个目录.这个目录中是平台扩展库.
在 “链接器” -> “输入” -> “附加依赖项” 中填写以下这些项.
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
根据使用的Qt5.9.0静态库的编译选项 MT 或 MD,在 “代码生成” -> “运行库” 中选择 MT 或 MD.
设置完毕,编译通过就行了.
使用CMake与Qt5.9.0静态库构建Qt应用
概述
Qt5对CMake的支持相当好(或者反过来说CMake对Qt5的支持也很好),经过简单配置,CMake就可以做为Qt5的构建工具.
之前以为使用cmake构建qt应用会非常麻烦,需要自己调用moc和指定UI文件的编译过程.其实Qt5的库中已经提供方便使用cmake的模块与宏命令.
例如:
- cmake 的CMAKE_AUTOMOC 变量,直接可以开启cmake在需要时自动运行moc功能.
- Qt5提供的cmake模块中, qt5_wrap_ui 宏可以直接从UI文件创建代码.
- 使用cmake的 target_link_libraries 命令,可以用这语法直接包含Qt的库文件
target_link_libraries( qt590static_test Qt5::Widgets )
详情请参考Qt官方文档 Qt 5.9 CMake Manual 与CMake官方文档 cmake-qt
实例
创建文件
在项目目录中创建文件 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
创建文件 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() { }
使用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>
创建文件 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(); }
创建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 )
编译项目
使用 VS2015 x64 本机工具命令提示符 进入项目目录.
最好创建构建目录build_x64_Debug 与build_x64_Release,好分开构建Debug与Release版本.进入构建目录,例如进入build_x64_Debug 后,执行命令:
cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug
当然,也可以使用VS IDE,那么就使用命令:
cmake .. -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Debug
编译项目,使用命令:
nmake
或者使用VS IDE打开项目并编译.
OK,构建成功