qtserialport 与 qtcreator-ros-plugin 中的 CMake?

Posted

技术标签:

【中文标题】qtserialport 与 qtcreator-ros-plugin 中的 CMake?【英文标题】:qtserialport with CMake in qtcreator-ros-plugin? 【发布时间】:2020-04-30 03:08:20 【问题描述】:

我正在尝试使用 ROS 插件将 qtserialport 编译到我在 QtCreator4.9.2 中的项目中。

当然,我已经按照doc 将qtserialport 安装到我的Ubuntu16.04。然后,我做了一些这样的测试:

#include "QtSerialPort/qserialport.h"
#include "QtSerialPort/qserialportinfo.h"

...

Q_FOREACH(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) 
    ROS_INFO("Name: %s", info.portName().toStdString().c_str());
    ROS_INFO("Description: %s", info.description().toStdString().c_str());
    ROS_INFO("Manufacturer: %s", info.manufacturer().toStdString().c_str());
    ...

但是,搞错了:

undefined reference to 'QSerialPortInfo::availablePorts()'
undefined reference to 'QSerialPortInfo::portName() const'
undefined reference to 'QSerialPortInfo::description() const'
...
undefined reference to 'QSerialPortInfo::~QSerialPortInfo()'

你知道,我正在使用 CMake,所以关于 qmake 或 .pro 介绍的官方文档对我来说毫无用处。而且我找到了一些建议,例如this,但是,我对此感到困惑:如何将 qtserialport 作为模块?

无论如何,我只想说:如何使用我的 ros CMake 项目编译 qtserialport?当然,它也应该适用于我的 QtCreator。

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.0)
project(xxx)

add_compile_options(-std=c++11)

find_package(catkin REQUIRED COMPONENTS qt_build roscpp)
include_directories($catkin_INCLUDE_DIRS)
catkin_package()

rosbuild_prepare_qt4(QtCore QtGui QtOpenGL)

file(GLOB QT_RESOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR rsources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS include/xxx/*.hpp)

QT4_ADD_RESOURCES(QT_RSOURCES_CPP $QT_RESOURCES)
QT4_WRAP_CPP(QT_MOC_HPP $QT_MOC)

set(QT_SOURCES ...)
if(MSVC)
    set(...)
endif(MSVC)

add_definitions(...)
include_directories(...)
set(EXTERNAL_LIBRARIES OpenThreads osg osgDB osgViewer osgUtil osgText osgGA pthread lz4 bz2)

add_executable(... $QT_SOURCES $QT_RESOURCES_CPP $QT_MOC_HPP)
target_link_libraries(xxx $QT_LIBRARIES $EXTERNAL_LIBRARIES $catkin_LIBRARIES)
install(TARGETS xxx RUNTIME DESTINATION $CATKIN_PACKAGE_BIN_DESTINATION)

救命!

【问题讨论】:

展示 CMakeLists.txt 在 Qt4 中没有 QtSerialPort 【参考方案1】:

QtCreator4.9.2 是您的 IDE 版本,而不是您可能正在使用 Qt 5.1x.x 版本的框架版本。

如果你想在你的 IDE 中编译,这一行是必不可少的

set(CMAKE_PREFIX_PATH your/qt/path/which/can/be/obtained)

从 QT Creator 中检查此路径 > 打开 Qt 项目 > 左侧栏上的项目选项 > 项目构建选项,在 CMake 设置中检查 cmake_prefix_path

# Before add_executable
find_package(Qt5 COMPONENTS Core SerialPort REQUIRED)

# After add_executable
target_link_libraries($PROJECT_NAME PRIVATE
    Qt5::Core Qt5::SerialPort)

您还可以在 Qt 路径的 CMake 文件夹下了解包名称。

/your/sys/path/Qt5/lib/cmake

【讨论】:

以上是关于qtserialport 与 qtcreator-ros-plugin 中的 CMake?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 串口通信

QtSerialPort 在错误的线程中实例化,导致信号/插槽失败

Arduino 和 QtSerialPort 始终打开错误

在 Qt Creator (Windows) 中构建 Qt 库的问题

串行数据包丢失 - QTSerialPort

为啥 QtSerialPort 在运行超过一次或两次后不会读取?