版權聲明:本文爲博主原創文章,未經博主容許不得轉載。windows
在windows下,運行Qt Command Prompt。api
輸入命令行:多線程
qmake -tp vc XXX.pro
ide
會生成文件XXX.vcxproj工具
Visual Studio的project轉成QT Creator的ui
projecturl
本人QT生手,最近項目上卻有個需求,要將本來的Visual Studio的project轉成QT Creator的project。在進行了一番研究和動手實踐以及再研究再實踐以後,終於成功完成了這一轉換,特此記錄。spa
環境:.net
- Visual Studio 2013 (Ultimate)
- QT 5.5 Community
- 本來的VS工程是一個生成dll的工程
- 本來的VS工程實際上是基於QT Template的工程
(安裝了QT的VS插件,就能夠在VS裏創建基於QT template的工程。可是這裏又有故事了。對於Visual Studio 2013,插件(add-in)已經再也不是推薦的方式,推薦的方式叫作package或extension。因此一旦你安裝了QT的插件(每每是2012版的),再想卸載它就無比困難了,就連MSDN上也沒能寫一個很清晰的解決方案,而網上的解決方案多爲修改註冊表,筆者沒有試過,不知道可否卸載乾淨。)
先介紹一下QT工程的特色。相比於VS,QT的工程文件很簡單,就是一個.pro文件,固然,有的時候還有.pri文件和.pro.user文件。.pro文件的目的是爲了實現cross platform,即跨平臺。.pro文件的內容都是配置信息,好比指明頭文件所在,庫文件所在,庫文件名,目標文件名等等。.pri文件也是一種.pro文件,只是由於它是假定要被某.pro文件include的,因此叫.pri而沒有叫.pro文件。在個人實例當中,.pri文件中主要是HEADERS和SOURCES,分別表明頭文件和源文件。最後,.pro.user文件是一個xml文件,它是自動生成的,主要記錄的是QT Creator裏項目的配置信息,包括一些系統的環境變量等。
關於.pro文件的內容以及如何編寫.pro文件,網上有不少不錯的文章,這裏就不贅述了。貼幾篇文章的連接以下:
以上談.pro文件的時候還談到了qmake,那麼它是什麼呢?爲什麼說.pro文件是爲了跨平臺而寫的呢?原來,qmake是Trolltech公司(於2008年被諾基亞收購)建立的用來爲不一樣的平臺和編譯器書寫Makefile的工具。手寫Makefile是比較困難而且容易出錯的,尤爲是須要給不一樣的平臺和編譯器組合寫幾個Makefile。使用qmake,開發者建立一個簡單的「項目」文件(即.pro文件)而且運行qmake生成適當的Makefile。qmake會注意全部的編譯器和平臺的依賴性,能夠把開發者解放出來只關心他們的代碼。Trolltech公司使用qmake做爲Qt庫和Qt所提供的工具的主要連編工具。
那麼瞭解了qmake和.pro文件的寫法以後,再來看看個人轉換歷程吧。
第一步,由於原Visual Studio工程就是基於QT Template的工程,因此咱們能夠用VS裏的QT插件裏的"Create basic .pro file..."菜單選項來自動生成一個.pro文件,實際上,不只僅生成了.pro 文件,還生成了.pri文件。可是目前的.pro文件仍是不能用的,由於其中還有大量的配置須要修改,好比INCLUDEPATH和LIBS.
第二步,修改.pro文件使其包含正確而必要的配置信息。
總結筆者對.pro文件的具體修改以下:
1. TEMPLATE = lib
2. 將DESTDIR = xxx改爲:
Release:DESTDIR = xxx/Release
Debug:DESTDIR = xxx/Debug
3. CONFIG += debug_and_release
4. 完善INCLUDEPATH
5. 完善DEPENDPATH (這裏又有故事了:過後筆者發現,只要在LIBS裏寫了-L"<LIBPATH>",就不必寫DEPENDPATH了。)
6. 加上 Release:DEPENDPATH 和 Debug:DEPENDPATH
7. 相似的,完善LIBS,添加Release:LIBS和Debug:LIBS
第三步,雙擊改好的.pro文件,QT Creator打開此工程,選中合適的Kit,就能夠build了。由於是64位機器,Kit選的是QT 5.5.1的msvc2013_64.
最後千萬要注意的是,在系統環境變量%PATH%裏,對於Visual Studio的編譯器cl.exe和連接器link.exe, 要選對路徑。好比,對於64位的機器,路徑 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64 應該被加到%PATH%中,而不是 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin 這一條在前一篇博文中已有詳細闡述。
以上步驟作完後,就能夠順利地在QT Creator中進行build了。
最後還要提醒的一點是,若是更改了.pro文件,想讓更改生效,必須手動刪除qmake生成的Makefile, Makefile.Debug和Makefile.Release文件。
下面是一個.pro文件的實例:
[plain] view plain copy
TEMPLATE = lib
TARGET = MyProject
Release:DESTDIR = ../../../Output/x64/Release
Debug:DESTDIR = ../../../Output/x64/Debug
QT += core qml
CONFIG += debug_and_release
DEFINES += WIN64 QT_DLL QT_QML_LIB MyProject_LIB
INCLUDEPATH += ./GeneratedFiles \
. \
./GeneratedFiles/Release \
$$(VC_INCLUDE) \
$$(VC_INCLUDE)/../atlmfc/include \
$$(WINSDK_INCLUDE)/shared \
$$(WINSDK_INCLUDE)/um
DEPENDPATH += . \
$$(WINSDK_LIB)/um/x64 \
$$(VC_LIB)/amd64 \
$$(QTDIR)/lib \
$$(QTDIR)/bin \
Release:DEPENDPATH += ../../../3rd_library/opencv/libs/Release/x64 \
../../../3rd_library/DirectShow/baseclasses/x64/Release
Debug:DEPENDPATH += ../../../3rd_library/opencv/libs/Debug/x64 \
../../../3rd_library/DirectShow/baseclasses/x64/Debug
MOC_DIR += ./GeneratedFiles/release
OBJECTS_DIR += release
UI_DIR += ./GeneratedFiles
RCC_DIR += ./GeneratedFiles
Release:LIBS += -L"../../../3rd_library/DirectShow/baseclasses/x64/Release" \
-lstrmbase \
-L"../../../3rd_library/opencv/libs/Release/x64" \
-lqtmain \
-lQt5Qml \
-lQt5Core \
-lopencv_calib3d248 \
-lopencv_contrib248 \
-lopencv_core248 \
-lopencv_features2d248 \
-lopencv_flann248 \
-lopencv_gpu248 \
-lopencv_highgui248 \
-lopencv_imgproc248 \
-lopencv_legacy248 \
-lopencv_ml248 \
-lopencv_nonfree248 \
-lopencv_objdetect248 \
-lopencv_ocl248 \
-lopencv_photo248 \
-lopencv_stitching248 \
-lopencv_superres248 \
-lopencv_ts248 \
-lopencv_video248 \
-lopencv_videostab248
Debug:LIBS += -L"../../../3rd_library/DirectShow/baseclasses/x64/Debug" \
-lstrmbasd \
-L"../../../3rd_library/opencv/libs/Debug/x64" \
-lqtmaind \
-lQt5Qmld \
-lQt5Cored \
-lopencv_calib3d248d \
-lopencv_contrib248d \
-lopencv_core248d \
-lopencv_features2d248d \
-lopencv_flann248d \
-lopencv_gpu248d \
-lopencv_highgui248d \
-lopencv_imgproc248d \
-lopencv_legacy248d \
-lopencv_ml248d \
-lopencv_nonfree248d \
-lopencv_objdetect248d \
-lopencv_ocl248d \
-lopencv_photo248d \
-lopencv_stitching248d \
-lopencv_superres248d \
-lopencv_ts248d \
-lopencv_video248d \
-lopencv_videostab248d
LIBS += -L"$$(WINSDK_LIB)/um/x64" \
-L"$$(VC_LIB)/amd64" \
-L"$$(QTDIR)/lib" \
-L"$$(QTDIR)/bin" \
-lWtsapi32 \
-lPathcch \
-l3DScanningEngine \
-lUserenv \
-lwinmm \
-lMf \
-lMfplat
include(MyProject.pri)
在實際build的過程當中,筆者又發現QT是調用jom.exe去作的。這是個什麼呢?原來,在VS裏面,有一個工具叫作nmake,它和Linux上的make很像。可是這個nmake有一個缺點(筆者不肯定如今還有沒有這個缺點,但在2009年的時候是有的),就是它沒法利用多核的優點並行編譯。因而,就有人寫了這麼一個叫作jom的工具,相似因而多線程版本的nmake. 最初的那篇介紹jom的文章在這裏: http://blog.qt.io/blog/2009/03/27/speeding-up-visual-c-qt-builds/