使用windows下qt5.12.0
目录
一、qt 工程构建
Qt工程构建设置由下面圈出的构建命令完成。
1、构建步骤
构建步骤分两步,第一步是qmake,第二步是make。
qmake步主要工作是用qmake.exe根据pro、make.conf等等文件生成makefile。(右键 执行qmake 就是运行该命令)
make步主要工作是用jom根据makefile生成.obj、.exe、.dll等目标文件。(右键 构建 就是执行该命令)
(一)qmake步
可以看到有两个命令:
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin\qmake.exe E:\workspace\QtWork\testEmpty\testEmpty.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
D:/Qt/Qt5.12.0/Tools/QtCreator/bin/jom.exe qmake_all
1、第一个命令表示用qmake 生成Makefile ,Makefile.Debug ,Makefile.Release三个文件
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin\qmake.exe E:\workspace\QtWork\testEmpty\testEmpty.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
如果.pro中的CONFIG有release和debug参数,或者有debug_and_release参数,就会生成Makefile.Debug 、Makefile.Release,以及debug、release文件夹。否则Makefile.Debug会与Makefile合并,只会生成Makefile。(这是qmake的工作,可以在.pro中用message($$CONFIG)来查看CONFIG变量的内容,qt生成一个Makefile就会输出一遍message内容,如果同时生成debug和release的makefile,message的内容就会在qt creator的概要信息窗口输出显示两遍,可以通过在message前加“!build_pass:”让message只运行一遍)
生成的Makefile是make、nmake、jom的默认输入文件。其中有几项qt常用的规则:
first: debug #默认执行的命令
debug: FORCE #debug构建规则
@set MAKEFLAGS=$(MAKEFLAGS)
$(MAKE) -f $(MAKEFILE).Debug #$(MAKE)是make、nmake、jom中的内置变量
debug-clean: FORCE
@set MAKEFLAGS=$(MAKEFLAGS)
$(MAKE) -f $(MAKEFILE).Debug clean
release: FORCE #release 构建规则
@set MAKEFLAGS=$(MAKEFLAGS)
$(MAKE) -f $(MAKEFILE).Release
release-clean: FORCE
@set MAKEFLAGS=$(MAKEFLAGS)
$(MAKE) -f $(MAKEFILE).Release clean
clean: debug-clean release-clean FORCE
-$(DEL_FILE) testEmpty.exp
-$(DEL_FILE) testEmpty.vc.pdb
-$(DEL_FILE) testEmpty.ilk
-$(DEL_FILE) testEmpty.idb
qmake_all: FORCE #暂时无定义的空规则
FORCE: #这条规则可以让其他对其有依赖的规则强制执行,而不会因为依赖文件没有更新而不执行
Makefile: ..\testEmpty\testEmpty.pro D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\win32-msvc\qmake.conf D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\spec_pre.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\common\angle.conf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\common\windows-vulkan.conf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\common\msvc-desktop.conf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\qconfig.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3danimation.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3danimation_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dcore.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dcore_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dextras.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dextras_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dinput.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dinput_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dlogic.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dlogic_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquick.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquick_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickanimation.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickanimation_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickextras.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickextras_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickinput.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickinput_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickrender.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickrender_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickscene2d.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3dquickscene2d_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3drender.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_3drender_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_accessibility_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_axbase.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_axbase_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_axcontainer.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_axcontainer_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_axserver.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_axserver_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_bluetooth.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_bluetooth_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_bootstrap_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_concurrent.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_concurrent_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_core.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_core_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_dbus.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_dbus_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_designer.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_designer_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_designercomponents_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_devicediscovery_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_edid_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_egl_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_eventdispatcher_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_fb_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_fontdatabase_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_gamepad.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_gamepad_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_gui.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_gui_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_help.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_help_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_location.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_location_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_multimedia.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_multimedia_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_multimediawidgets.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_multimediawidgets_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_network.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_network_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_nfc.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_nfc_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_opengl.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_opengl_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_openglextensions.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_openglextensions_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_packetprotocol_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_platformcompositor_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_positioning.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_positioning_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_positioningquick.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_positioningquick_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_printsupport.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_printsupport_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qml.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qml_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qmldebug_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qmldevtools_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qmltest.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qmltest_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_qtmultimediaquicktools_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quick.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quick_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quickcontrols2.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quickcontrols2_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quickparticles_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quickshapes_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quicktemplates2_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quickwidgets.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_quickwidgets_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_remoteobjects.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_remoteobjects_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_repparser.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_repparser_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_scxml.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_scxml_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_sensors.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_sensors_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_serialbus.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_serialbus_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_serialport.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_serialport_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_sql.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_sql_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_svg.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_svg_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_testlib.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_testlib_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_texttospeech.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_texttospeech_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_theme_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_uiplugin.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_uitools.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_uitools_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_vulkan_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_webchannel.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_webchannel_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_websockets.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_websockets_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_webview.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_webview_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_widgets.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_widgets_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_windowsuiautomation_support_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_winextras.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_winextras_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_xml.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_xml_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_xmlpatterns.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_xmlpatterns_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\modules\qt_lib_zlib_private.pri \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\qt_functions.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\qt_config.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\win32-msvc\qmake.conf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\spec_post.prf \
.qmake.stash \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\exclusive_builds.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\common\msvc-version.conf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\toolchain.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\default_pre.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\win32\default_pre.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\resolve_config.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\exclusive_builds_post.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\default_post.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\win32\console.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\qml_debug.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\precompile_header.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\warn_on.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\qt.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\resources.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\moc.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\win32\opengl.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\uic.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\qmake_use.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\file_copies.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\testcase_targets.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\exceptions.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\yacc.prf \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\mkspecs\features\lex.prf \
..\testEmpty\testEmpty.pro \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\lib\Qt5Widgets.prl \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\lib\Qt5Gui.prl \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\lib\Qt5Network.prl \
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\lib\Qt5Core.prl
$(QMAKE) -o Makefile ..\testEmpty\testEmpty.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
$(MAKEFILE).Debug: Makefile #表明Makefile.Debug和Makefile.Release依赖Makefile这个文件
$(MAKEFILE).Release: Makefile
2、第二个命令表示用jom执行Makefile中的qmake_all规则。从上面列出的Makefile文件可以看到qmake_all是空规则。也就是说默认情况下这条命令其实啥也没做。
D:/Qt/Qt5.12.0/Tools/QtCreator/bin/jom.exe qmake_all
(二)make步
jom.exe in E:\workspace\QtWork\build-testEmpty-Desktop_Qt_5_12_0_MSVC2015_64bit
make步只有一个命令, 就是在工作路径下运行jom.exe。该过程会根据依赖项先调用moc生成moc_*.cpp文件,然后与普通编译过程一样,根据产生的moc_*.cpp和原来的cpp文件生成目标exe。(Makefile.Debug太大就不列举出来了,有兴趣的可以用自己工程进行参考)
jom会默认采用当前路径下的Makefile 做为输入文件。并默认运行Makefile中的第一条规则(“first: debug”),可以第一条规则又依赖debug规则
debug: FORCE
@set MAKEFLAGS=$(MAKEFLAGS)
$(MAKE) -f $(MAKEFILE).Debug #-f指定文件
根据依赖,这样就开始了Makefile.Debug的make规则,同样默认开始执行Makefile.Debug的第一条规则(“first: all”)。
all: Makefile.Debug debug\testEmpty.exe
all又依赖debug\testEmpty.exe,最后溯源,可以看到依赖moc_*.cpp。
所依赖的moc_*cpp的生成规则如下(过程中调用了moc.exe):
D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin\moc.exe $(DEFINES) --compiler-flavor=msvc --include E:/workspace/QtWork/build-testEmpty-Desktop_Qt_5_12_0_MSVC2015_64bit/debug/moc_predefs.h -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/mkspecs/win32-msvc -IE:/workspace/QtWork/testEmpty -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/include -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/include/QtWidgets -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/include/QtGui -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/include/QtANGLE -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/include/QtNetwork -ID:/Qt/Qt5.12.0/5.12.0/msvc2015_64/include/QtCore -I. -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\shared" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\um" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\winrt" ..\testEmpty\base.h -o debug\moc_base.cpp
最终生成目标文件testEmpty.exe。
Makefile文件中,那个最长的规则“Makefile:” 表明qmake通过*.pro生成Makefile依赖了哪些文件!这条规则表明当依赖文件有所变化时,会执行命令:“$(QMAKE) -o Makefile ..\testEmpty\testEmpty.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"” (该命令的意义就是qmake重新生成一遍Makefile)
2、清除步骤
从qt构建模式的清除步骤项可以看出,清除步骤就一步,运行D:/Qt/Qt5.12.0/Tools/QtCreator/bin/jom.exe clean。对应执行Makefile中的clean 规则。
二、qt工程默认构建路径
qt默认构建路径是在这里设置:
这条语句 ../%{JS: Util.asciify("build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}")}生成的路径为:../build-plugandpaint-Desktop_Qt_5_12_0_MSVC2015_64bit-Debug
下面是所能识别的variables列表
三、通过Dos窗口运行命令进行qt工程编译
目的:理解qt编译过程及相关的依赖项。
1、打开Dos窗口,设置Dos窗口程序的环境变量Path,以便make运行时找到qmake.exe、moc.exe、cl.exe、jom.exe、linker.exe、rc.exe、nmake.exe以及相关的dll。环境变量Path是qt程序工作时寻找dll的默认路径,其逻辑在QApplication中实现,还有系统的默认“C:\Windows\SysWOW64”和当前工作路径,另外qt中还可以通过qt.conf文件来配置插件dll的路径。"set Path=..."只对当前运行的Dos窗口有效,Path值不会设置到系统环境变量Path中去,当前Dos窗口关闭后Path值就消失了。"setx Path=...." 会将值设置到系统环境变量中。
set Path=%Path%D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;C:\Program Files (x86)\Windows Kits\10\bin\x86;
可以将qt中的 项目->build&run->run->run Evironment->build Evironment 中的Path中的内容拷贝过来,通过命令set Path=....设置到Dos窗口的Path中。下面是几个关键路径和关键exe的解释:
(1)“D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin;”用于找到qmake.exe、moc.exe及相关dll
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64;"用于找到x64的cl.exe、linker.exe、nmake.exe及相关dll,
缺乏会报“'link' 不是内部或外部命令,也不是可运行的程序” 或者 “'cl' 不是内部或外部命令,也不是可运行的程序”
对应qt中kit中的配置:
(2)"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;"用于找到x86的cl.exe、linker.exe、nmake.exe及相关dll
需要注意的是编译64位的qt程序,Path中的x64的相关vs路径必须在x86的之前,否则会报“fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突”,(该错误的原因是用x86的cl.exe编译出目标程序,应该使用x64的cl.exe去编译出目标程序)报冲突后需要进行清理,运行“jom clean”,如果qt是x64的,最好的方式是Path中不加入x86相关的串。
Visual Studio 模块计算机类型“x64”与目标计算机类型“x86”冲突 - 一杯清酒邀明月 - 博客园
(3)“C:\Program Files (x86)\Windows Kits\10\bin\x86;”用于找到rc.exe及相关dll。
缺乏会报“LINK : fatal error LNK1158: 无法运行“rc.exe””
qt对rc.exe的查找是根据调试器的路径来进行搜寻的:
qmake.exe是qt中用于根据.pro生成Makefile文件的工具
moc.exe是qt中用于处理qt的关键字工具
jom.exe是qt中的make工具,通过输入Makefile生成目标文件。其路径为:D:\Qt\Qt5.12.0\Tools\QtCreator\bin,可以将其放入Dos的Path中。
cl.exe、lingker.exe、nmake.exe都是vs编译器相关的,nmake是vs中的make工具。cl.exe和linker.exe是vs的编译器和连接器,是jom进行make时必须依赖的工具。
rc.exe是windows中用于进行资源编译的工具,可以将qt工程中的.rc文件编译成可链接的.res文件。
资源编译器rc.exe的参数 - 百度文库
2、设置Dos窗口程序的环境变量INCLUDE(步骤与set Path 一样,取出build Evironment 中的Include项内容通过命令set INCLUDE=进行设置),以便make时找到标准头文件。环境变量INCLUDE是cl.exe寻找头文件的默认包含路径。缺乏会报“ fatal error C1083: 无法打开包括文件: “iostream””,可以与qt中build Evironment中的INCLUDE值进行对比。
下面是我电脑中qt中的 项目->build&run->run->run Evironment->build Evironment 中INCLUDE内容,不同电脑会有差异:
set INCLUDE=%INCLUDE%C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\winrt;
3、设置Dos窗口程序的环境变量LIB(步骤与上面一样),以便make找到系统库和标准库以及msvc相关的库,环境变量LIB是cl.exe寻找库的默认包含路径。缺乏会报“LINK : fatal error LNK1104: 无法打开文件“msvcprtd.lib” ”,可以与qt中build Evironment中的LIB值进行对比。
下面是我电脑中qt中的 项目->build&run->run->run Evironment->build Evironment 中LIB内容,不同电脑会有差异:
set LIB=%LIB%C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\ucrt\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\x64;C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64;
4、创建构建路径,我的构建路径为:E:\workspace\QtWork\build-testEmpty-Desktop_Qt_5_12_0_MSVC2015_64bit。打开dos窗口,进入E:\workspace\QtWork,创建文件夹build-testEmpty-Desktop_Qt_5_12_0_MSVC2015_64bit。进入。
5、输入命令:qmake -o Makefile E:\workspace\QtWork\testEmpty\testEmpty.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
该命令意义是让qmake根据.pro文件生成makefile
默认的工程qmake之后一般都会生成Makefile、Makefile.Debug、Makefile.Release
6、输入命令:D:\Qt\Qt5.12.0\Tools\QtCreator\bin\jom.exe
该命令的意义是根据前面生成的Makefile进行构建,运行makefile中的第一条规则。Makefile为默认输入文件。
7、输入命令:D:\Qt\Qt5.12.0\Tools\QtCreator\bin\jom.exe clean
该命令是运行makefile中的clean规则项,进行清理工作。
C:\Users\Phi>echo %Path% #Dos中打印Path环境变量
Makefile 中 FORCE_一起交流的博客-CSDN博客_makefile中的force
makefile的规则_如来fo的博客-CSDN博客_makefile规则
概述 — 跟我一起写Makefile 1.0 文档