c++ Qt #define“signals”与GStreamer(gst)冲突

m3eecexj  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(155)

Qt似乎以Q开头命名其他所有内容,它做到了这一点:qobjectdefs.h中的#define signals signals
然而,GStream并不自然地认为signals是保留字,而是这样做

struct _GDBusInterfaceInfo
{
  /*< public >*/
  volatile gint         ref_count;
  gchar                *name;
  GDBusMethodInfo     **methods;
  GDBusSignalInfo     **signals;         <==================
  GDBusPropertyInfo   **properties;
  GDBusAnnotationInfo **annotations;
};

gdbusintrospection.h中。
我只是假设Qt和GStreamer不能很好地配合,还是有办法解决这个问题?
注意:如果我不使用#define Q_MOC_RUN,Qt可以被说服使用#define signals signals。但这会导致使用

class
{
   public:
      // stuff
   signals:
      // stuff
   private:
      // stuff
};

正如你现在可能已经猜到的,我正试图从一个不在身边支持它的人那里接管代码,谷歌不是我的朋友:-(
[更新]谢谢,@IpApp的提示(这是不起作用的,唉)。
我得到了别人的密码。显然它是为目标构建的,但从来没有为单元测试构建过,我必须这样做(为什么他混合和匹配,我不知道)。
当我在Eclipse CDT中使用QT_NO_KEYWORDS时,我会得到错误,因为类定义代码没有使用Q_SINGAL(S)-它使用signals宏(现在定义为signals)来定义某些公共成员。
我不被允许修改subsytsem代码,只是为了模拟它的接口,但我不喜欢模拟所有的Qt和Glib,因为工作量很大。
也许有一种方法可以为其中一个或另一个使用库,而不是将它们的目录包含在源路径中?

mbjcgjjk

mbjcgjjk1#

只需在您的qmake项目文件中遵循以下文档:

CONFIG += no_keywords

如果你使用的不是qmake,请确保在你的buildsystem中定义了以下内容:

QT_NO_KEYWORDS

然后,你需要确保你在头文件的所有地方都使用了Q_SIGNALS或Q_SIGNAL,这样moc( meta对象编译器)仍然会被通知它是一个信号。

t2a7ltrp

t2a7ltrp2#

我发现了另一个解决方案,对我来说更方便和简单-你应该在Qt头之前包括glib头,仅此而已。正如之前的glib代码一样,它不受Qt定义语句的影响。

kx1ctssn

kx1ctssn3#

来自QT文档:

  • 定义QT_NO_SIGNALS_SLOTS_KEYWORDS
  • Q_SLOTS替换slots,用Q_SIGNALS替换signals

相关问题