栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022-05-24 QRemoteObject在CMake项目遇到的问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-05-24 QRemoteObject在CMake项目遇到的问题

文章目录
  • 前言
  • 问题
  • 解决方法
  • 总结


前言

Qt Remote Objects 是Qt官方推出的一个用于进程间通信(IPC)的模块,而且支持网络通讯。
详细用法网络上很多,Qt官方手册也讲的很清楚,要学习用的话强烈建议去看官方手册,看手册完全可以搞明白。

问题

目前我这里还是使用的qt5.15.2版本,而且项目管理已由qmake转为cmake,但在cmake中遇到无法生成rep_***_source.h 的情况,下面记录问题产生的过程和解决方法。

解决方法

以下以commoninterface.rep 文件为例
在qmake中,生成 rep_commoninterface_source.h

REPC_REPLICA   += 
    ../Reps/commoninterface.rep

qmake,然后构建 后就可以生成 rep_commoninterface_source.h 文件

但在cmake中,需使用qt5_generate_repc(),注意Qt6中又有不同的函数 ,注意看手册
https://doc-snapshots.qt.io/qt6-dev/qtremoteobjects-repc.html
https://doc-snapshots.qt.io/qt6-dev/qtremoteobjects-cmake-qt-add-repc-sources.html
这里只说Qt5中的用法:
官方手册说明:https://doc.qt.io/qt-5/qtremoteobjects-cmake-qt5-generate-repc.html
最初我的cmake写法:

cmake_minimum_required(VERSION 3.16)
project(RoClient VERSION 1.0 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Set up AUTOMOC and some sensible defaults for runtime execution
# When using Qt 6.3, you can replace the code block below with
# qt_standard_project_setup()
set(CMAKE_AUTOMOC ON)
include(GNUInstallDirs)

find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS RemoteObjects)

add_executable(RoClient
    main.cpp
#    rep_commoninterface_merged.h
)
qt5_generate_repc(RoClient Reps/commoninterface.rep MERGED)


target_link_libraries(RoClient PRIVATE
    Qt${QT_VERSION_MAJOR}::Core
    Qt${QT_VERSION_MAJOR}::RemoteObjects
)

install(TARGETS RoClient
    BUNDLE DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

但执行后,不管是cmake还是构建,都无法生成rep_commoninterface_merged.h
直到后来有人说,需要将rep_commoninterface_merged.h 加入到目标列表中才可以,具体是因为qt5_generate_repc里面使用到了add_custom_command这个命令,目标文件必须要在target列表里,才可以正常工作。
所以

add_executable(RoClient
    main.cpp
#    rep_commoninterface_merged.h
)

改为

add_executable(RoClient
    main.cpp
    rep_commoninterface_merged.h
)

即可正常工作。

总结

其实官方手册里也写是这么用的,

find_package(Qt5 COMPONENTS RemoteObjects REQUIRED)

set(SOURCES
    main.cpp
    simpleswitch.cpp
)

qt5_generate_repc(SOURCES simpleswitch.rep SOURCE)

add_executable(directconnectserver ${SOURCES})
target_link_libraries(directconnectserver Qt5::RemoteObjects)

只是没有注意到这个问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928422.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号