前言
由于工作需要,同時(shí)也為了方便以后的集成升級,希望將之前用Qt creator qmake開發(fā)的項(xiàng)目移植到cmake項(xiàng)目中,并使用Visual Studio 進(jìn)行后續(xù)開發(fā),本文主要用以記錄該過程中的常規(guī)步驟和遇到的特殊情況。
qmake項(xiàng)目
在一開始,為了降低開發(fā)難度以及快速完成業(yè)務(wù)開發(fā),我們使用Qt Creator原生編譯器以及qmake來進(jìn)行軟件界面研發(fā)。編寫pro文件來生成makefile,makefile將用于指導(dǎo)后續(xù)的各種編譯器生成可執(zhí)行文件。(關(guān)于makefile的介紹可以參考這篇文章添加鏈接描述)
下面我們大致介紹一下該項(xiàng)目原本的pro文件。其中我刪減了部分無關(guān)緊要的內(nèi)容,只保留將被轉(zhuǎn)換為cmake工程所需要的東西。
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 添加xml文件讀寫功能
QT+=xml
CONFIG += c++11
include(D:/software/QT5.14.0/package/VTK-8.2.0/VTK-8.2.0.pri)
# 如果要使用VTKACtorToOSG功能 需要引入 osg庫
INCLUDEPATH +=D:/BaiduNetdiskDownload/install/include
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losg
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgd
?
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgViewer
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgViewerd
?
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgDB
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgDBd
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -lOpenThreads
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -lOpenThreads
SOURCES += \
customUnit/dockwidget.cpp \
customUnit/mycustomslider.cpp \
...
HEADERS += \
customUnit/dockwidget.h \
customUnit/mycustomslider.h \
...
FORMS += \
customUnit/dockwidget.ui \
...
其中包含了Qt的幾個(gè)模塊功能庫,vtk庫,以及osg庫中的幾個(gè)模塊。
VTK庫中僅包含了MSVC編譯的release版本。
OSG庫也是用的MSVC編譯的release版本。
Qt庫使用MSVC編譯的包含debug版本和release版本。
編譯器使用對應(yīng)的MSVC 編譯器。
這里有個(gè)遺留問題,開發(fā)設(shè)備上原本的Qt creator只有Mingw的編譯器,為了讓其支持MSVC編譯,我們在Visual Studio 中下載了MSVC2017版本來使用,但Qtcreator無法自動(dòng)識別該編譯器,我們手動(dòng)配置一個(gè)自定義的編譯器選項(xiàng)去查找到它(這個(gè)問題在后續(xù)的移植工作中會在導(dǎo)入庫的時(shí)候再次出現(xiàn))。
到cmake工程的移植
為了方便,我們先使用Qtcreator創(chuàng)建了一個(gè)cmake工程,讓它幫我們先生成一部分cmakelist.txt代碼。
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX COMPILER WORKS 1)
project(Window_cmake_version )
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
if(ANDROID)
add_library(Window_cmake_version SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
else()
add_executable(Window_cmake_version
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
endif()
target_link_libraries(Window_cmake_version PRIVATE Qt5::Widgets)
其中自動(dòng)包含了Qt的庫的引入。
我們一一對應(yīng)將pro中的內(nèi)容轉(zhuǎn)為cmakelist.txt中的內(nèi)容。
qmake
QT += core gui
QT += widgets
QT+=xml
cmake
find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt5 COMPONENTS Xml REQUIRED)
find_package(Qt5 COMPONENTS Gui REQUIRED)
target_link_libraries(Window_cmake_version PRIVATE Qt5::Widgets)
target_link_libraries(Window_cmake_version PRIVATE Qt5::Xml)
target_link_libraries(Window_cmake_version PRIVATE Qt5::Gui)
qmake
//為了便于引入庫,我們在vtk庫中編寫了pri文件,實(shí)際上它只是簡化了導(dǎo)入lib和頭文件的過程
include(D:/software/QT5.14.0/package/VTK-8.2.0/VTK-8.2.0.pri)
cmake
//這里我們使用cmake查找包的方式來導(dǎo)入vtk庫
find_package(VTK REQUIRED)
if(VTK_FOUND)
message(STATUS "found VTK_DIR")
else(VTK_FOUND)
message(FATAL_ERROR "VTK not found. Please set VTK_DIR")
endif(VTK_FOUND)
include(${VTK_USE_FILE})
target_link_libraries(Window_cmake_version
PRIVATE optimized ${VTK_LIBRARIES})
qmake
# 如果要使用VTKACtorToOSG功能 需要引入 osg庫(只使用部分庫,不需要全引入) 這里實(shí)際上只用到了release版本
INCLUDEPATH +=D:/BaiduNetdiskDownload/install/include
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losg
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgd
?
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgViewer
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgViewerd
?
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgDB
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -losgDBd
win32:CONFIG(release, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -lOpenThreads
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/BaiduNetdiskDownload/install/lib/ -lOpenThreads
cmake
# 查找OSG 庫 該方式也適用于vtk庫的導(dǎo)入
target_include_directories(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/include)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/osg.lib)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/osgViewer.lib)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/osgDB.lib)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/OpenThreads.lib)
qmake
SOURCES += \
customUnit/dockwidget.cpp \
customUnit/mycustomslider.cpp \
...
HEADERS += \
customUnit/dockwidget.h \
customUnit/mycustomslider.h \
...
FORMS += \
customUnit/dockwidget.ui \
...
cmake
set(HEADERS
customUnit/dockwidget.h
customUnit/mycustomslider.h
...
)
set(UI
customUnit/dockwidget.ui
...
)
set(SOURCES
customUnit/dockwidget.cpp
customUnit/mycustomslider.cpp
...
)
add_executable(Window_cmake_version
${SOURCES} ${UI} ${HEADERS} )
到這里我們大致上就實(shí)現(xiàn)了pro文件到cmakelist.txt文件的遷移。
最終生成的cmakelist.txt文件
cmake_minimum_required(VERSION 3.5)
#set(CMAKE_PREFIX_PATH "D:/software/QT5.14.0/5.14.0/mingw73_64")
project(Window_cmake_version)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#set (CMAKE_CXX COMPILER WORKS 1)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt5 COMPONENTS Xml REQUIRED)
find_package(Qt5 COMPONENTS Gui REQUIRED)
set(HEADERS
customUnit/dockwidget.h
customUnit/mycustomslider.h
...
)
set(UI
customUnit/dockwidget.ui
...
)
set(SOURCES
customUnit/dockwidget.cpp
customUnit/mycustomslider.cpp
...
)
# 查找 VTK 庫
#find_package(VTK REQUIRED PATHS D:/software/QT5.14.0/package/VTK-8.2.0/lib/cmake/vtk-8.2)
find_package(VTK REQUIRED)
if(VTK_FOUND)
message(STATUS "found VTK_DIR")
else(VTK_FOUND)
message(FATAL_ERROR "VTK not found. Please set VTK_DIR")
endif(VTK_FOUND)
include(${VTK_USE_FILE})
add_executable(Window_cmake_version
${SOURCES} ${UI} ${HEADERS} )
# 查找OSG 庫
target_include_directories(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/include)
#add_executable(untitled11)
#add_executable(untitled11 main.cpp )
target_link_libraries(Window_cmake_version PRIVATE Qt5::Widgets)
target_link_libraries(Window_cmake_version PRIVATE Qt5::Xml)
target_link_libraries(Window_cmake_version PRIVATE Qt5::Gui)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/osg.lib)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/osgViewer.lib)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/osgDB.lib)
target_link_libraries(Window_cmake_version PRIVATE D:/BaiduNetdiskDownload/install/lib/OpenThreads.lib)
target_link_libraries(Window_cmake_version
PRIVATE optimized ${VTK_LIBRARIES})
實(shí)際運(yùn)行后我們遇到了幾個(gè)問題:
-
cmakelist find_find_package() 方式找包機(jī)制找到了環(huán)境中的vtk8.1的包,這并不是我們想要的8.2的包,同樣qt庫也出現(xiàn)了一樣的問題,找到了Mingw的版本庫,這必然是無法接受的,目前的解決方案是去CMakeSettings.json中手動(dòng)修改它自動(dòng)尋找填充的項(xiàng)。應(yīng)該有更好的解決方案,希望不吝賜教。
-
使用MSVC release版本編譯后,dll鏈接錯(cuò)誤(無法定義到入口xxx等問題),這和qt打包應(yīng)用程序類似,需要把相關(guān)dll都收集過來扔到可執(zhí)行程序目錄下即可解決,如果有更好的解決方案,也希望評論留言交流一下。
-
相關(guān)庫dll都收集完后依然運(yùn)行時(shí)報(bào)錯(cuò):
This application failed to start because it could not find or load the Qt platform plugin “windows”
Reinstalling the application may fix this problem.
解決辦法:文章來源:http://www.zghlxwxcb.cn/news/detail-703383.html
QT為了簡化生成發(fā)布版本,特別提供了工具 “windeployqt.exe”,這個(gè)工具在 "…\Qt5.8.0\5.8\msvc2017_64\bin"的 目錄下,通過該命令,可以解決上述錯(cuò)誤。
打開控制臺窗口
設(shè)置搜索路徑以便系統(tǒng)可以搜索到 “windeployqt.exe”
在windeployqt.exe目錄下,運(yùn)行 “windeployqt.exe sample.exe”, 所需要的QT運(yùn)行庫就自動(dòng)拷貝到目標(biāo)程序目錄了。如果運(yùn)行報(bào)錯(cuò),重新輸入為:./windeployqt.exe sample.exe文章來源地址http://www.zghlxwxcb.cn/news/detail-703383.html
到了這里,關(guān)于QT轉(zhuǎn)型Visual Studio(qmake項(xiàng)目到cmake項(xiàng)目的移植)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!