将 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的主要内容,如果未能解决你的问题,请参考以下文章