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)

只是没有注意到这个问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值