从 dbus xml 生成文件时,如何告诉 qmake 包含标头?

Posted

技术标签:

【中文标题】从 dbus xml 生成文件时,如何告诉 qmake 包含标头?【英文标题】:How to tell to qmake to include headers, when generating files from dbus xml? 【发布时间】:2018-08-24 16:03:19 【问题描述】:

TLDR:我如何告诉 qmake 使用 dbus xml 描述生成文件,其中包含适当的标头?

完整示例和更多信息如下。


我描述 dbus 接口的 xml 文件 (custom.xml) 如下所示:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE node PUBLIC
  "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
  "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">

<node>
  <interface name="com.my.custom">

    <method name="Get">
      <arg type="a(sss)" name="info" direction="out"/>
      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="InfoArray"/>
    </method>

  </interface>
</node>

pro 文件(ex.pro)如下所示:

TEMPLATE = lib

CONFIG += c++14 warn_on

QT += dbus

DBUS_INTERFACES += custom.xml

HEADERS += Info.hpp
SOURCES += Info.cpp

头文件(Info.hpp):

#ifndef INFO_HPP
#define INFO_HPP


#include <QtDBus/QtDBus>
#include <QtCore/QString>
#include <QtCore/QList>
#include <QtCore/QMetaType>


class Info

public:

    friend const QDBusArgument &operator>>( const QDBusArgument &argument, Info& data );
    friend QDBusArgument &operator<<( QDBusArgument &argument, const Info& data );


    QString a;
    QString b;
    QString c;
;

typedef QList< Info > InfoArray;

Q_DECLARE_METATYPE(Info);
Q_DECLARE_METATYPE(InfoArray);

inline void registerCommType()

    qDBusRegisterMetaType<Info>();
    qDBusRegisterMetaType< InfoArray >();


#endif

和源文件(Info.cpp):

#include "Info.hpp"

QDBusArgument& operator<<( QDBusArgument& argument,
                           const Info& data )

    argument.beginStructure();
        argument << data.a;
        argument << data.b;
        argument << data.c;
    argument.endStructure();

    return argument;


const QDBusArgument& operator>>( const QDBusArgument& argument,
                                 Info& data )

    argument.beginStructure();
        argument >> data.a;
        argument >> data.b;
        argument >> data.c;
    argument.endStructure();

    return argument;

当我尝试创建 Makefile 并构建库时,它失败了,因为生成的文件中的类型未知,因为生成的文件不包含 Info.hpp

dejovivl@DEECLU52:~/workspace/qtdbus_custom$ qmake
Info: creating stash file /home/dejovivl/workspace/qtdbus_custom/.qmake.stash
dejovivl@DEECLU52:~/workspace/qtdbus_custom$ make
arm-pdm3-linux-gnueabi-g++  -march=armv7-a -marm -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi -c -pipe  -O2 -pipe -g -feliminate-unused-debug-types  --sysroot=/opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi -O2 -std=gnu++1y -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_DBUS_LIB -DQT_CORE_LIB -I. -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5 -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5/QtGui -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5/QtDBus -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5/QtCore -I. -I/opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/lib/qt5/mkspecs/linux-oe-g++ -o Info.o Info.cpp
/opt/2017.12.6_2-cc/sysroots/x86_64-pdm3sdk-linux/usr/bin/qt5/qdbusxml2cpp -p custom_interface.h: custom.xml
/opt/2017.12.6_2-cc/sysroots/x86_64-pdm3sdk-linux/usr/bin/qt5/qdbusxml2cpp -i custom_interface.h -p :custom_interface.cpp custom.xml
arm-pdm3-linux-gnueabi-g++  -march=armv7-a -marm -mfpu=neon  -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi -c -pipe  -O2 -pipe -g -feliminate-unused-debug-types  --sysroot=/opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi -O2 -std=gnu++1y -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_DBUS_LIB -DQT_CORE_LIB -I. -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5 -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5/QtGui -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5/QtDBus -isystem /opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/include/qt5/QtCore -I. -I/opt/2017.12.6_2-cc/sysroots/cortexa9hf-neon-pdm3-linux-gnueabi/usr/lib/qt5/mkspecs/linux-oe-g++ -o custom_interface.o custom_interface.cpp
In file included from custom_interface.cpp:12:0:
custom_interface.h:39:30: error: ‘InfoArray’ was not declared in this scope
     inline QDBusPendingReply<InfoArray> Get()
                              ^~~~~~~~~
custom_interface.h:39:39: error: template argument 1 is invalid
     inline QDBusPendingReply<InfoArray> Get()
                                       ^
custom_interface.h: In member function ‘int ComMyCustomInterface::Get()’:
custom_interface.h:42:77: error: cannot convert ‘QDBusPendingCall’ to ‘int’ in return
         return asyncCallWithArgumentList(QStringLiteral("Get"), argumentList);
                                                                             ^
Makefile:663: recipe for target 'custom_interface.o' failed
make: *** [custom_interface.o] Error 1

我在pro文件中使用什么选项,所以生成的头文件包含Info.hpp?

我知道qdbusxml2cpp 包含带有-i 选项的标题。如何告诉 qmake 去做?

【问题讨论】:

【参考方案1】:

这是QTBUG-11677。自 Qt 5.0 起已修复。有两种方法:

    每个文件组 - 推荐:

    custom_interface.files = custom.xml
    custom_interface.header_flags = -i Info.hpp
    DBUS_INTERFACES += custom_interface
    

    为所有接口头文件设置全局选项 - 这一点都不好,因为它会污染所有生成的接口头,可能是不相关的类型。

    QDBUSXML2CPP_INTERFACE_HEADER_FLAGS += -i Info.hpp
    

另外 - 您不应包含 &lt;QtModule/QClass&gt;,因为这会将项目配置错误推迟到链接时间。为方便起见,直接包含&lt;QClass&gt; - 或整个模块&lt;QtModule&gt;。如果文件无法编译,则 makefile 已过时,您需要重新运行 qmake。

【讨论】:

以上是关于从 dbus xml 生成文件时,如何告诉 qmake 包含标头?的主要内容,如果未能解决你的问题,请参考以下文章

UDisks2 的 Dbus 自省不完整?

linux 进程间通信 dbus-glib实例详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

在子窗口小部件活动时阻止 QMa​​inWindow ,pyqt

如何使用 DBus 中已有的服务?

如何让 g_dbus_connection_signal_subscribe 函数告诉我有关预先存在的对象/接口的信息?

如何通过 dbus 调用 varargs 函数?