【问题标题】:How to resolve conflicting types problem In C如何在 C 中解决冲突类型问题
【发布时间】:2019-05-29 11:55:37
【问题描述】:

我正在尝试在我自己的 C 程序中重新使用 BlueZ 代码来管理蓝牙连接并遇到编译问题。

当我进一步分析问题时,我认为这是正在发生的事情:

这一切都归结为我的程序结构:

1.myadv.c includes myadv.h includes gio.h
2. myadv.c includes "gdbus.h" (Helper lib)

现在的问题是 gdbus.h 的某些符号定义(typedef、方法等)与 gio.h 中的内部定义冲突

因此我得到如下编译器错误:

/usr/include/glib-2.0/gio/gioenums.h:1383:3: error: conflicting types for ‘GDBusSignalFlags’
 } GDBusSignalFlags;
   ^~~~~~~~~~~~~~~~

conflicting types for ‘g_dbus_proxy_new’
 void             g_dbus_proxy_new  

在包含期间避免此类符号冲突错误的最佳做法是什么?请注意,我需要同时使用这两个头文件:

  1. gio.h(gnome 库)
  2. gdbus.h(直接从 BlueZ 借来的 dbus 助手)

【问题讨论】:

  • 是否可以对代码进行分区,以便一个文件包含gio.h,另一个包含gdbus.h,但两者都不包含?那将是最干净的解决方案。希望当您尝试链接结果时不会出现任何符号表冲突。
  • @TomKarzes 这最终可能是不可能的,因为在 adv.c 中我需要进行两个操作。一项操作使用 中的符号,另一项使用 gdbus.h 中的符号。 E
  • 即使你把它们分成两个文件并以互斥的方式包含库,它们也会间接同时出现在第三个文件中,对吗?
  • @TomKarzes 你还是让我思考。让我看看我能在那个方向做些什么。
  • 您似乎有更深层次的问题。毫不奇怪,我发现 BueZ 的源代码使用 glib。这就解释了为什么你的两个标题依赖于一些相同的符号。但是符号定义不匹配意味着它们使用了不同版本的glib。除非您能调和这种差异,否则这不太可能结束。

标签: c header dbus


【解决方案1】:

不要使用gdbus.h from BlueZ。它与 GLib 不兼容,但错误地使用了 GLib 符号命名空间(g_ 或 G 前缀)。

使用GDBus API from GLib itself,因为您已经在项目中使用了 GLib/GIO。

【讨论】:

  • 菲利普感谢您的回答。我在尝试使用 GDBus API 时没有遇到任何问题。问题是我试图合并来自 BlueZ 的代码来调用其众所周知的方法,如 RegisterAdvertisement 等......
  • 提出 DBus 广告对象,导出它然后调用 RegisterAdvertisement 只是样板代码,我希望我可以从 BlueZ(gdbus.h 和 objects.c)复制粘贴借用。不幸的是,它变得更加困难。
猜你喜欢
  • 2019-12-04
  • 2021-12-21
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多