将 CMakeLists QT4 更新为 QT5

Posted

技术标签:

【中文标题】将 CMakeLists QT4 更新为 QT5【英文标题】:Update CMakeLists QT4 to QT5 【发布时间】:2018-06-07 10:42:21 【问题描述】:

我使用的是基于 QT4 的旧的 CMakeLists 包:

cmake_minimum_required(VERSION 2.8.0)
project(pol)

add_compile_options(-std=c++17)
find_package(catkin REQUIRED COMPONENTS qt_build roscpp sensor_msgs cv_bridge image_transport)
find_package(OpenCV REQUIRED)
include_directories($catkin_INCLUDE_DIRS)

catkin_package()

rosbuild_prepare_qt4(QtCore QtGui) # Add the appropriate components to the component list here


file(GLOB QT_FORMS RELATIVE $CMAKE_CURRENT_SOURCE_DIR ui/*.ui)
file(GLOB QT_RESOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR resources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS include/pol/*.hpp)

QT4_ADD_RESOURCES(QT_RESOURCES_CPP $QT_RESOURCES)
QT4_WRAP_UI(QT_FORMS_HPP $QT_FORMS)
QT4_WRAP_CPP(QT_MOC_HPP $QT_MOC)


file(GLOB_RECURSE QT_SOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS src/*.cpp)


add_executable(pol $QT_SOURCES $QT_RESOURCES_CPP $QT_FORMS_HPP $QT_MOC_HPP)
target_link_libraries(pol $QT_LIBRARIES $catkin_LIBRARIES)
install(TARGETS pol RUNTIME DESTINATION $CATKIN_PACKAGE_BIN_DESTINATION)

现在我正在尝试迁移到 QT5 的最新版本,所以我是这样开始的:

cmake_minimum_required(VERSION 3.1.0)

project(pol)

add_compile_options(-std=c++17)

find_package(catkin REQUIRED COMPONENTS qt_build roscpp sensor_msgs cv_bridge image_transport)
find_package(OpenCV REQUIRED)
include_directories($catkin_INCLUDE_DIRS)

catkin_package()
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5 COMPONENTS Core Gui Widgets)

rosbuild_prepare_qt4(QtCore QtGui) # Add the appropriate components to the component list here

file(GLOB QT_FORMS RELATIVE $CMAKE_CURRENT_SOURCE_DIR ui/*.ui)
file(GLOB QT_RESOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR resources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS include/fmf_qt/*.hpp)

QT5_ADD_RESOURCES(QT_RESOURCES_CPP $QT_RESOURCES)
QT5_WRAP_UI(QT_FORMS_HPP $QT_FORMS)

include_directories(
    $Qt5Core_INCLUDE_DIRS
    $Qt5Gui_INCLUDE_DIRS
    $Qt5Widgets_INCLUDE_DIRS
    )

file(GLOB_RECURSE QT_SOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS src/*.cpp)

add_executable(pol $QT_SOURCES $QT_RESOURCES_CPP $QT_FORMS_HPP $QT_MOC_HPP)
target_link_libraries(pol Qt5::Widgets Qt5::Core $QT_LIBRARIES $catkin_LIBRARIES)
install(TARGETS pol RUNTIME DESTINATION $CATKIN_PACKAGE_BIN_DESTINATION)

现在我收到了一些错误,我认为这是由于我的新 CMakeLists 造成的,例如

error: incomplete type ‘QImage’ used in nested name specifier
error: invalid use of incomplete type ‘class QImage’

这个包是在ROS ubuntu 18.04 LTS下开发,用gcc 8.1编译的,你知道我新的CMakeLists有什么问题吗? 该软件包与我的旧 CMakeLists 一起使用!

编辑

我正确运行cmake

cmake ../src -DCMAKE_INSTALL_PREFIX=../install -DCATKIN_DEVEL_PREFIX=../devel

但是当我运行make时出现错误

【问题讨论】:

这些错误从何而来——当您运行cmake 或在生成的makefile 上调用make 时? @G.M.当我运行make 时,我编辑了我的帖子 在 Stack Overflow 上,我们希望代码包含在问题帖子本身中,而不是链接。请在您的问题中解决该问题。 @Tsyvarev 我试过了,但它说代码太多 嗯,奇怪。两个代码 sn-ps 总共有不到 60 行。但更重要的是,错误在您的.cpp 代码中,而不是在CMakeLists.txt 中。 (也就是说,CMakeLists.txt 可以装袋,但 .cpp 也有窃听器)。 【参考方案1】:

这是使用 Qt 和 cmake 的方法:

    cmake_minimum_required(VERSION 3.9)

    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)

    project(QCameraBug)

    # required packages
    find_package(Qt5 COMPONENTS Core Quick Multimedia REQUIRED)

    add_executable($PROJECT_NAME "main.cpp" "main.qrc")

    target_compile_features($PROJECT_NAME PRIVATE cxx_std_14)

    target_link_libraries($PROJECT_NAME
        Qt5::Core
        Qt5::Quick
        Qt5::Multimedia
    )

这对我来说非常有效。希望对您有所帮助

【讨论】:

【参考方案2】:

您收到这些错误是因为当时正在编译的源文件正在使用 QImage,但编译器只能看到前向声明而不是完整的类定义。

对于有问题的源文件,您需要添加(假设您的包含路径正确)...

#include <QImage>

以前,当使用Qt4 时,QImage 标头可能被其他Qt 标头文件之一传递包含,这就是没有错误的原因。

【讨论】:

以上是关于将 CMakeLists QT4 更新为 QT5的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 中使用 cmake 设置 qt4?

cmake 学习-cmakelists.txt

wps打开出现计算机中丢失Qt5C

CMake 路径中的错误

将 Makefile 转换为 CMakeLists.txt

将简单的 makefile 转换为 CMakeLists.txt?