QT转型Visual Studio(qmake项目到cmake项目的移植)

这篇具有很好参考价值的文章主要介绍了QT转型Visual Studio(qmake项目到cmake项目的移植)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

由于工作需要,同时也为了方便以后的集成升级,希望将之前用Qt creator qmake开发的项目移植到cmake项目中,并使用Visual Studio 进行后续开发,本文主要用以记录该过程中的常规步骤和遇到的特殊情况。

qmake项目

在一开始,为了降低开发难度以及快速完成业务开发,我们使用Qt Creator原生编译器以及qmake来进行软件界面研发。编写pro文件来生成makefile,makefile将用于指导后续的各种编译器生成可执行文件。(关于makefile的介绍可以参考这篇文章添加链接描述)
下面我们大致介绍一下该项目原本的pro文件。其中我删减了部分无关紧要的内容,只保留将被转换为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的几个模块功能库,vtk库,以及osg库中的几个模块。
VTK库中仅包含了MSVC编译的release版本。
OSG库也是用的MSVC编译的release版本。
Qt库使用MSVC编译的包含debug版本和release版本。
编译器使用对应的MSVC 编译器。
这里有个遗留问题,开发设备上原本的Qt creator只有Mingw的编译器,为了让其支持MSVC编译,我们在Visual Studio 中下载了MSVC2017版本来使用,但Qtcreator无法自动识别该编译器,我们手动配置一个自定义的编译器选项去查找到它(这个问题在后续的移植工作中会在导入库的时候再次出现)。

到cmake工程的移植

为了方便,我们先使用Qtcreator创建了一个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)

其中自动包含了Qt的库的引入。
我们一一对应将pro中的内容转为cmakelist.txt中的内容。
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文件,实际上它只是简化了导入lib和头文件的过程
include(D:/software/QT5.14.0/package/VTK-8.2.0/VTK-8.2.0.pri)

cmake

//这里我们使用cmake查找包的方式来导入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库(只使用部分库,不需要全引入) 这里实际上只用到了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库的导入
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} )

到这里我们大致上就实现了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})

实际运行后我们遇到了几个问题:

  1. cmakelist find_find_package() 方式找包机制找到了环境中的vtk8.1的包,这并不是我们想要的8.2的包,同样qt库也出现了一样的问题,找到了Mingw的版本库,这必然是无法接受的,目前的解决方案是去CMakeSettings.json中手动修改它自动寻找填充的项。应该有更好的解决方案,希望不吝赐教。
    QT转型Visual Studio(qmake项目到cmake项目的移植),QT/C++/项目开发,qt,visual studio,开发语言,qmake,cmake,c++

  2. 使用MSVC release版本编译后,dll链接错误(无法定义到入口xxx等问题),这和qt打包应用程序类似,需要把相关dll都收集过来扔到可执行程序目录下即可解决,如果有更好的解决方案,也希望评论留言交流一下。

  3. 相关库dll都收集完后依然运行时报错:

    This application failed to start because it could not find or load the Qt platform plugin “windows”

    Reinstalling the application may fix this problem.

    解决办法:

    QT为了简化生成发布版本,特别提供了工具 “windeployqt.exe”,这个工具在 "…\Qt5.8.0\5.8\msvc2017_64\bin"的 目录下,通过该命令,可以解决上述错误。
    打开控制台窗口
    设置搜索路径以便系统可以搜索到 “windeployqt.exe”
    在windeployqt.exe目录下,运行 “windeployqt.exe sample.exe”, 所需要的QT运行库就自动拷贝到目标程序目录了。如果运行报错,重新输入为:./windeployqt.exe sample.exe文章来源地址https://www.toymoban.com/news/detail-703383.html

到了这里,关于QT转型Visual Studio(qmake项目到cmake项目的移植)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

            出于某种目的(合法的,真的合法的,合同上明确指出可以这样做),我准备了一个重命名所有标识符的VS扩展,用来把一个C#库改头换面,在简单的测试项目上工作很满意,所有标识符都被准确替换。我还尝试用在C++项目上,问题就比较多了,因为VS并不能准确识别

    2024年02月05日
    浏览(42)
  • Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

    把插件的更新也一起取消了 字体对开发也很重要,不同字体,字母形态都不太一样,尤其是标点符号,逗号和分号的区分,有的字体看着这两者就很像 这样打开了很多个文件,就不会导致有的打开的文件被隐藏 相当于idea 查看当前类或接口的结构 Structure 支持快捷键与鼠标右

    2023年04月16日
    浏览(86)
  • Visual Studio连接Linux服务器编译CMake项目,生成在Linux上运行的程序

    window系统:Windows 10 企业版 64位操作系统 Linux系统:BigCloud Enterprise Linux 7.8 (Core) Visual Studio:Microsoft Visual Studio Enterprise 2019 版本 16.10.4 根据Microsoft官网文档介绍, 开始之前 首先,请确保已安装 Visual Studio Linux 工作负载,包括 CMake 组件。 它属于 Visual Studio 安装程序中的“使用

    2024年02月13日
    浏览(70)
  • 【无标题】visual studio2019+Qt5.15.2+PCL1.12.1+vtk9.1.0+cmake3.22.2

    安装VS------安装Qt-------安装PCL------安装cmake-----安装VTK-----环境配置 安装用了两天时间 1环境搭建 1.1 Visual Studio 2019 (PCL所需版本) https://my.visualstudio.com/Downloads?q=visual%20studio%202019wt.mc_id=o msft vscom~older-downloads 1.2 Qt安装 https://download.qt.io/archive/online install 选择online install ●选择安装

    2024年02月16日
    浏览(35)
  • asp.net审计项目管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

    一、源码特点         asp.net审计项目管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发 二、功能介绍 (1)科室管理:对科室信息进行添加、删除、修改和查看 (2)权限管

    2024年02月11日
    浏览(39)
  • 【QtQuick3D学习】使用Qt Design Studio设计UI并导入Qt Creator项目中使用——基于C++和Cmake

    新版本中项目文件全部放在了一起,见 【QtQuick3D学习】使用Qt Creator创建Qt Design Studio项目测试运行——基于C++和Cmake 【QtQuick3D学习】使用Qt Design Studio创建项目并使用Qt Creator打开测试运行——基于C++和Cmake 这里测试前后端分离,即使用Qt Design Studio设计前端和交互逻辑,C++写后

    2024年02月01日
    浏览(31)
  • CMake入门教程【高级篇】qmake转cmake

    😈 「CSDN主页」 :传送门 😈 「Bilibil首页」 :传送门 😈 「动动你的小手」 : 点赞 👍 收藏 ⭐️ 评论 📝

    2024年01月25日
    浏览(41)
  • CMake入门教程【实战篇】使用开源库cmake-modules简化项目开发与维护

    本教程介绍了rpavlik/cmake-modules,一个CMake模块集合,旨在简化和优化CMakeLists.txt文件的编写和维护工作。该集合尤其对虚拟现实和物理模拟包的开发者有用,同时也包含通用实用模块和针对旧版CMake的补丁或解决方案。 项目托管在GitHub上,可通过链接访问:rpavlik/cmake-modules 查

    2024年01月15日
    浏览(39)
  • 使用 Visual Studio Code 调试 CMake 脚本

    之前被引入到 Visual Studio 中的 CMake 调试器,现已在 Visual Studio Code 中可用。 也就是说,现在你可以通过在 VS Code 中安装 CMake 工具扩展,来调试你的 CMakeLists.txt 脚本了。是不是很棒? Visual C++ 开发团队和 CMake 的维护者 Kitware 一直密切合作,目的是将我们的 CMake 调试器实现集成

    2024年02月13日
    浏览(34)
  • 通过cmake工程生成visual studio解决方案

    visual studio是一个很强大的开发工具,这个工具主要是通过解决方案对我们的源码进行编译等操作。但是我们很多时候拿到的可能并不是一个直接的解决方案,可能是是一个cmake工程,那么这个时候我们就需要通过cmake工程生成解决方案,然后就可以通过visual studio进行编译和调

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包